A documentação para o módulo python argparse , embora excelente, tenho certeza, é demais para o meu pequeno cérebro iniciante entender agora. Não preciso fazer contas na linha de comando nem interferir com as linhas de formatação na tela ou alterar os caracteres das opções. Tudo o que eu quero fazer é "Se arg é A, faça isso, se B fizer isso, se nenhuma das opções acima mostrar ajuda e sair" .
529
sys.argv
para o argumento que quiser ...Respostas:
Minha compreensão da pergunta original é dupla. Primeiro, em termos do exemplo de argumento mais simples possível, estou surpreso por não ter visto aqui. É claro que, para simplificar, também está tudo sobrecarregado com pouco poder, mas pode ajudar você a começar.
Mas esse argumento posicional é agora necessário. Se você deixar de fora ao chamar este programa, receberá um erro sobre a falta de argumentos. Isso me leva à segunda parte da pergunta original. Matt Wilkie parece querer um único argumento opcional sem um rótulo nomeado (os rótulos --option). Minha sugestão seria modificar o código acima da seguinte maneira:
Pode muito bem haver uma solução mais elegante, mas isso funciona e é minimalista.
fonte
Aqui está a maneira como eu faço isso
argparse
(com vários argumentos):args
será um dicionário que contém os argumentos:No seu caso, basta adicionar apenas um argumento.
fonte
foo.py --action install
oufoo.py --action remove
em vez de simplesmentefoo.py install
parser.add_argument('install', help='Install the app')
(Observe que você não pode definir um argumento posicionalrequired=True
)args
ditado foi gerado como acima.args.foo
e emargs.bar
vez da sintaxe do dicionário. De qualquer maneira, é claro, mas args não é realmente um dicionário, mas umargparse.Namespace
objeto.A
argparse
documentação é razoavelmente boa, mas deixa de fora alguns detalhes úteis que podem não ser óbvios. (@ Diego Navarro já mencionou um pouco disso, mas tentarei expandir um pouco sua resposta.) O uso básico é o seguinte:O objeto do qual você volta
parse_args()
é um objeto 'Namespace': um objeto cujas variáveis de membro são nomeadas após os argumentos da linha de comando. ONamespace
objetivo é como você acessa seus argumentos e os valores associados a eles:(Observe que
argparse
substitui '-' nos nomes dos argumentos por sublinhados ao nomear as variáveis.)Em muitas situações, você pode querer usar argumentos simplesmente como sinalizadores que não têm valor. Você pode adicionar aqueles no argparse assim:
O exemplo acima criará variáveis nomeadas 'foo' com o valor True e 'no_foo' com o valor False, respectivamente:
Observe também que você pode usar a opção "obrigatório" ao adicionar um argumento:
Dessa forma, se você omitir esse argumento na linha de comando
argparse
, ele faltará e interromperá a execução do seu script.Por fim, observe que é possível criar uma estrutura de ditado para seus argumentos usando a
vars
função, se isso facilitar a vida para você.Como você pode ver,
vars
retorna um ditado com seus nomes de argumento como chaves e seus valores como, er, valores.Existem muitas outras opções e coisas que você pode fazer, mas isso deve abranger os cenários de uso comuns mais essenciais.
fonte
'-f'
e'-b'
? Por que você não pode omitir isso?man cp
ouman ls
e você encontrará muitas opções nos dois sabores (por exemplo-f, --force
). Provavelmente, existem várias razões pelas quais as pessoas preferem um ou outro, mas, em qualquer caso, é bastante padrão disponibilizar os dois formulários no seu programa.Matt está perguntando sobre parâmetros posicionais em argparse, e eu concordo que a documentação do Python está ausente nesse aspecto. Não há um exemplo completo e único nas ~ 20 páginas ímpares que mostram a análise e o uso de parâmetros posicionais .
Nenhuma das outras respostas aqui mostra um exemplo completo de parâmetros posicionais, então aqui está um exemplo completo:
O que me impressionou é que o argparse converterá o argumento nomeado "--foo-bar" em "foo_bar", mas um parâmetro posicional chamado "foo-bar" permanece como "foo-bar", tornando menos óbvio como use-o no seu programa.
Observe as duas linhas próximas ao final do meu exemplo - nenhuma delas funcionará para obter o valor do parâmetro posicional foo-bar. O primeiro está obviamente errado (é uma expressão aritmética args.foo menos barra), mas o segundo também não funciona:
Se você deseja usar o
foo-bar
atributo, deve usá-logetattr
, como visto na última linha do meu exemplo. O que é louco é que, se você tentassedest=foo_bar
alterar o nome da propriedade para algo mais fácil de acessar, receberia uma mensagem de erro realmente bizarra:Veja como o exemplo acima é executado:
fonte
nargs='?'
é o encantamento para uma "posição opcional", conforme stackoverflow.com/questions/4480075/… #foo-bar
não ser transformadafoo_bar
é abordada em bugs.python.org/issue15125 .print args.foo_bar
funciona. Como é um argumento posicional, você não precisa especificar o nome ao chamar o script, portanto, isso não importa para o usuário.getattr
(também é mais flexível, pois permite alterar um argumento de opcional para posicional sem precisar alterar o código que usa o valor).Mais uma introdução resumida, inspirada neste post .
Os argumentos são definidos com combinações do seguinte:
As opções comuns são:
--help
é usado.float
ouint
(caso contrário, éstr
).'-x', '--long-name', dest='longName'
).Nota: por padrão,
--long-name
é acessado comargs.long_name
store_true, store_false
: para args booleanos'--foo', action='store_true' => args.foo == True
store_const
: para ser usado com a opçãoconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: para opções repetidas, como em./myscript.py -vv
'-v', action='count' => args.v == 2
append
: para opções repetidas, como em./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).fonte
Observe o Tutorial Argparse nos HOWTOs do Python . Começa a partir dos exemplos mais básicos, como este:
e progride para menos básicos.
Há um exemplo com escolha predefinida para uma opção, como o que é perguntado:
fonte
Aqui está o que eu criei no meu projeto de aprendizagem, graças principalmente a @DMH ...
Código de demonstração:
Isso pode ter evoluído e está disponível online: command-line.py
Script para treinar este código: command-line-demo.sh
fonte
Você também pode usar plac (um invólucro em torno de
argparse
).Como um bônus, ele gera instruções simples de ajuda - veja abaixo.
Script de exemplo:
Exemplo de saída:
Nenhum argumento fornecido -
example.py
:Argumento inesperado fornecido -
example.py C
:Argumento correto fornecido -
example.py A
:Menu de ajuda completo (gerado automaticamente) -
example.py -h
:Breve explicação:
O nome do argumento geralmente é igual ao nome do parâmetro (
arg
).A anotação de tupla após o
arg
parâmetro tem o seguinte significado:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Documentação:
Para saber mais sobre o uso do plac, confira a excelente documentação:
fonte
Para adicionar ao que outros declararam:
Eu geralmente gosto de usar o parâmetro 'dest' para especificar um nome de variável e, em seguida, usar 'globals (). Update ()' para colocar essas variáveis no espaço de nomes global.
Uso:
Código:
fonte
argparse
Usa internamentegetattr
esetattr
para acessar valores no Namespace. Dessa forma, não é incomodado pordest
valores estranhamente formados .Uma maneira realmente simples de usar argparse e alterar as opções '-h' / '--help' para exibir suas próprias instruções de ajuda de código pessoal é definir a ajuda padrão como False; você também pode adicionar quantos .add_arguments adicionais desejar :
Execute: python test.py -h
Resultado:
fonte
A resposta mais simples!
PS quem escreveu o documento de argparse é tolo
código python:
código em execução
fonte