Eu sou originalmente um programador C. Eu já vi vários truques e "hacks" para ler muitos argumentos diferentes.
Quais são algumas das maneiras pelas quais os programadores de Python podem fazer isso?
Relacionado
- Qual é a melhor maneira de capturar / analisar argumentos da linha de comando passados para um script Python?
- Implementando interfaces de linha de comando no estilo “[comando] [ação] [parâmetro]”?
- Como processar argumentos de linha de comando no Python?
- Como formatar argumentos posicionais ajuda a usar a opção optparse do Python?
python
command-line
command-line-arguments
Martineau
fonte
fonte
Respostas:
A solução canônica na biblioteca padrão é
argparse
( docs ):Aqui está um exemplo:
argparse
suporta (entre outras coisas):fonte
optparse
está obsoleto, o solicitante da pergunta não é mais um membro no estouro de pilha e esta é a resposta aceita em uma pergunta altamente visível - considere reescrever completamente seu código de exemplo para usar o stdlibargparse
.sys.argv
é uma lista que contém todos os argumentos passados para o script na linha de comando.Basicamente,
fonte
sys.argv[1:]
(evita o nome do script).Apenas por aí evangelizando por argparse, o que é melhor para esses motivos .. essencialmente:
(copiado do link)
O módulo argparse pode manipular argumentos posicionais e opcionais, enquanto o optparse pode manipular apenas argumentos opcionais
argparse não é dogmático sobre como deve ser sua interface de linha de comando - opções como -file ou / file são suportadas, assim como as opções necessárias. A Optparse se recusa a oferecer suporte a esses recursos, preferindo pureza a praticidade
argparse produz mensagens de uso mais informativas, incluindo o uso da linha de comando determinado a partir de seus argumentos, e ajuda mensagens para argumentos posicionais e opcionais. O módulo optparse exige que você escreva sua própria cadeia de uso e não tem como exibir ajuda para argumentos posicionais.
argparse suporta ações que consomem um número variável de argumentos da linha de comando, enquanto o optparse exige que o número exato de argumentos (por exemplo, 1, 2 ou 3) seja conhecido antecipadamente
O argparse suporta analisadores que despacham para subcomandos, enquanto o optparse requer a configuração
allow_interspersed_args
e a execução do despacho do analisador manualmenteE meu favorito pessoal:
add_argument()
sejam especificados com chamadas simples, enquanto o optparse requer atributos de classe de hackers comoSTORE_ACTIONS
ouCHECK_METHODS
para obter uma verificação de argumento adequadafonte
-f
or--foo
, enquanto "número exato de argumentos deve ser conhecido antecipadamente" presumivelmente significa argumentos posicionais fornecidos sem nenhum sinalizador de opção anterior.Há também
argparse
módulo stdlib (um "aprimoramento" nooptparse
módulo stdlib ). Exemplo da introdução ao argparse :Uso:
fonte
Uma maneira de fazer isso é usando
sys.argv
. Isso imprimirá o nome do script como o primeiro argumento e todos os outros parâmetros que você passar para ele.fonte
A biblioteca docopt é realmente boa. Ele cria um argumento de argumento a partir da cadeia de uso do seu aplicativo.
Por exemplo, do documento readme:
fonte
Se você precisar de algo rápido e não muito flexível
main.py:
Então corra
python main.py James Smith
para produzir a seguinte saída:
fonte
python main.py "James Smith"
o que colocaJames Smith
emsys.argv[1]
e produz umaIndexError
quando você tentar usar o inexistentesys.argv[2]
. O comportamento de cotação dependerá de qual plataforma e shell você executa o Python.python main.py "James Joseph Smith"
? Se você estiver preocupado com o índice fora dos limites, poderá adicionar uma verificação do número de argumentos fornecidos. Menos realista ou não, meu exemplo mostra como lidar com vários argumentos.gmail-trash-msg.py MessageID
. Esta resposta é simples: oMessageID
parâmetro de teste foi passadosys.argv[1]
.fonte
Eu mesmo uso o optparse, mas gosto muito da direção que Simon Willison está tomando com sua recentemente introduzida biblioteca optfunc . Funciona por:
Então, por exemplo, esta definição de função:
é transformado neste texto de ajuda optparse:
fonte
Eu gosto do getopt do stdlib, por exemplo:
Ultimamente, tenho envolvido algo semelhante a isso para tornar as coisas menos detalhadas (por exemplo, tornando implícito "-h").
fonte
De Pocoo clique é mais intuitivo, requer menos clichê e é pelo menos tão poderoso quanto o argparse.
A única fraqueza que encontrei até agora é que você não pode fazer muita personalização para ajudar as páginas, mas isso geralmente não é um requisito e o docopt parece ser a escolha certa .
fonte
Como você pode ver optparse "O módulo optparse foi descontinuado e não será desenvolvido mais; o desenvolvimento continuará com o módulo argparse ".
fonte
fonte
Você pode estar interessado em um pequeno módulo Python que escrevi para facilitar ainda mais o manuseio de argumentos de linha de comando (código aberto e livre para usar) - Comando
fonte
Eu recomendo olhar docopt como uma alternativa simples para esses outros.
O docopt é um novo projeto que funciona analisando sua mensagem de uso --help, em vez de exigir que você implemente tudo sozinho. Você apenas precisa colocar sua mensagem de uso no formato POSIX.
fonte
Ainda outra opção é argh . Ele se baseia no argparse e permite que você escreva coisas como:
Ele gera automaticamente ajuda e assim por diante, e você pode usar decoradores para fornecer orientações extras sobre como a análise de argumentos deve funcionar.
fonte
argh
é mais fácil que outras bibliotecas ou usarsys
.argh
mas não é particularmente adequado para cenários em que seu maior desejo é não ter um comando com subcomandos.def frobnicate_spleches(...)
definir uma função que faça o que seu script fizer e, em seguida, fazerif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
no final do arquivo.Minha solução é entrypoint2 . Exemplo:
Texto de ajuda:
fonte