Qual é o método ou a biblioteca mais fácil , concisa e flexível para analisar argumentos de linha de comando do Python?
Qual é o método ou a biblioteca mais fácil , concisa e flexível para analisar argumentos de linha de comando do Python?
Esta resposta sugere o optparse
que é apropriado para versões mais antigas do Python. Para Python 2.7 e superior, argparse
substitui optparse
. Veja esta resposta para mais informações.
Como outras pessoas apontaram, é melhor você optar pelo oposto do que pelo getopt. O getopt é praticamente um mapeamento individual das funções padrão da biblioteca getopt (3) C, e não é muito fácil de usar.
O optparse, embora seja um pouco mais detalhado, é muito melhor estruturado e mais simples de estender mais tarde.
Aqui está uma linha típica para adicionar uma opção ao seu analisador:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Ele praticamente fala por si; no tempo de processamento, ele aceitará -q ou --query como opções, armazenará o argumento em um atributo chamado query e terá um valor padrão se você não o especificar. Também é auto-documentado, na medida em que você declara o argumento de ajuda (que será usado quando executado com -h / - help) ali mesmo com a opção
Geralmente você analisa seus argumentos com:
options, args = parser.parse_args()
Por padrão, isso analisará os argumentos padrão passados para o script (sys.argv [1:])
options.query será então definido como o valor que você passou para o script.
Você cria um analisador simplesmente fazendo
parser = optparse.OptionParser()
Estes são todos os princípios básicos que você precisa. Aqui está um script Python completo que mostra isso:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5 linhas de python que mostram o básico.
Salve-o em sample.py e execute-o uma vez com
python sample.py
e uma vez com
python sample.py --query myquery
Além disso, você descobrirá que o optparse é muito fácil de estender. Em um dos meus projetos, criei uma classe Command que permite aninhar subcomandos em uma árvore de comandos facilmente. Ele usa optparse fortemente para encadear comandos juntos. Não é algo que eu possa explicar facilmente em poucas linhas, mas fique à vontade para procurar no meu repositório a classe principal, bem como uma classe que o use e o analisador de opções
-mcProfile -o program.prof
mas o agrparcer está capturando esses argumentos, como passar esses argumentos para python exe ???argparse
é o caminho a percorrer. Aqui está um breve resumo de como usá-lo:1) Inicializar
2) Adicionar argumentos
3) Analisar
4) Acesso
5) Verificar valores
Uso
Uso correto:
Argumentos incorretos:
Ajuda completa:
fonte
Usando docopt
Desde 2012, existe um módulo muito fácil, poderoso e muito interessante para análise de argumentos chamado docopt . Aqui está um exemplo retirado de sua documentação:
Então é isso: duas linhas de código, mais a sua sequência de documentos, que é essencial e você obtém seus argumentos analisados e disponíveis no seu objeto de argumentos.
Usando python-fire
Desde 2017, há outro módulo interessante chamado python-fire . Ele pode gerar uma interface CLI para seu código, sem a análise de argumentos. Aqui está um exemplo simples da documentação (este pequeno programa expõe a função
double
à linha de comando):Na linha de comando, você pode executar:
fonte
A nova maneira moderna é
argparse
por esses motivos. argparse> optparse> getoptupdate: A partir do py2.7, o argparse faz parte da biblioteca padrão e o optparse está obsoleto.
fonte
Eu prefiro o Click . Ele abstrai as opções de gerenciamento e permite "(...) criar belas interfaces de linha de comando de uma maneira composível, com o mínimo de código necessário".
Aqui está um exemplo de uso:
Também gera automaticamente páginas de ajuda bem formatadas:
fonte
Praticamente todo mundo está usando getopt
Aqui está o código de exemplo para o documento:
Então, em uma palavra, aqui está como isso funciona.
Você tem dois tipos de opções. Aqueles que estão recebendo argumentos e aqueles que são como interruptores.
sys.argv
é praticamente seuchar** argv
em C. Como em C, você pula o primeiro elemento, que é o nome do seu programa, e analisa apenas os argumentos:sys.argv[1:]
Getopt.getopt
irá analisá-lo de acordo com a regra que você fornecer no argumento."ho:v"
aqui descreve as curtas argumentos:-ONELETTER
. O:
meio que-o
aceita um argumento.Finalmente
["help", "output="]
descreve argumentos longos (--MORETHANONELETTER
). A=
saída posterior significa novamente que a saída aceita um argumento.O resultado é uma lista de pares (opção, argumento)
Se uma opção não aceita nenhum argumento (como
--help
aqui), aarg
parte é uma sequência vazia. Você geralmente deseja fazer um loop nesta lista e testar o nome da opção como no exemplo.Espero que isso tenha ajudado.
fonte
getopt
nas versões mais recentes do Python, essa resposta ficou desatualizada.getopt
ainda não está obsoleto… Mas sua documentação afirma que ele é principalmente fornecido para usuários familiarizados com agetopt()
função C e reconhece que para outros usuáriosargparse
pode ser uma solução melhor, permitindo "escrever menos código e obter melhor ajuda e mensagens de erro ".Uso
optparse
que acompanha a biblioteca padrão. Por exemplo:Fonte: Usando o Python para criar ferramentas de linha de comando UNIX
No entanto, a partir do Python 2.7 optparse está obsoleta, consulte: Por que usar argparse em vez de optparse?
fonte
Caso precise, isso pode ajudar se você precisar pegar argumentos unicode no Win32 (2K, XP, etc.):
fonte
Padrões de argumento de linha de comando leve
Embora
argparse
seja ótimo e seja a resposta certa para opções de linha de comando totalmente documentadas e recursos avançados, você pode usar os padrões de argumento de função para manipular argumentos posicionais diretos com muita simplicidade.O argumento 'name' captura o nome do script e não é usado. A saída de teste é assim:
Para scripts simples em que eu apenas quero alguns valores padrão, acho isso suficiente. Você também pode querer incluir algum tipo de coerção nos valores de retorno ou os valores da linha de comando serão cadeias de caracteres.
fonte
Eu prefiro optar por obter. É muito declarativo: você diz os nomes das opções e os efeitos que elas devem ter (por exemplo, definindo um campo booleano) e fornece um dicionário preenchido de acordo com suas especificações.
http://docs.python.org/lib/module-optparse.html
fonte
Acho que a melhor maneira para projetos maiores é a opção optparse, mas se você estiver procurando uma maneira fácil, talvez http://werkzeug.pocoo.org/documentation/script seja algo para você.
Então, basicamente, toda função action_ * é exposta à linha de comando e uma boa mensagem de ajuda é gerada gratuitamente.
fonte
declarative_parser
. Obviamente, se alguém estiver trabalhando com o werkzeug, talvez seja melhor manter o arquivowerkzung.script
. De qualquer forma, sou um grande fã dessa abordagem.O código Argparse pode ser maior que o código de implementação real!
Esse é um problema que acho que nas opções de análise de argumento mais populares é que, se seus parâmetros são modestos, o código para documentá-los se torna desproporcionalmente grande para o benefício que eles oferecem.
Um recém-chegado relativo à cena de análise de argumentos (eu acho) é plac .
Ele faz algumas trocas reconhecidas com argparse, mas usa a documentação embutida e envolve simplesmente a
main()
função de função type:fonte
consoleargs merece ser mencionado aqui. É muito fácil de usar. Confira:
Agora no console:
fonte
Aqui está um método, não uma biblioteca, que parece funcionar para mim.
Os objetivos aqui devem ser concisos, cada argumento analisado por uma única linha, os argumentos alinhados para facilitar a leitura, o código é simples e não depende de nenhum módulo especial (apenas os + sys), alerta sobre argumentos ausentes ou desconhecidos normalmente , use um loop for / range () simples e funcione no python 2.xe 3.x
São mostrados dois sinalizadores de alternância (-d, -v) e dois valores controlados pelos argumentos (-i xxx e -o xxx).
O objetivo do NextArg () é retornar o próximo argumento enquanto verifica a falta de dados, e 'skip' ignora o loop quando o NextArg () é usado, mantendo o sinalizador analisando em um só forro.
fonte
Estendi a abordagem de Erco para permitir argumentos posicionais necessários e argumentos opcionais. Estes devem preceder os argumentos -d, -v etc.
Argumentos posicionais e opcionais podem ser recuperados com PosArg (i) e OptArg (i, padrão), respectivamente. Quando um argumento opcional é encontrado, a posição inicial da busca por opções (por exemplo, -i) é movida 1 adiante, para evitar causar um fatal 'inesperado'.
fonte