Solo un'opzione di riga di comando con Argparse
Domanda
Sto cercando di creare una CLI con il modulo ArgParse ma mi piacerebbe avere comandi diversi con requisiti di argomento diversi, ho provato questo:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', help='foo help')
parser.add_argument('test', nargs=1, help='test help')
args = parser.parse_args()
Quello che vorrei è poter correre python test.py foo
e python test.py test somearg
Ma quando corro python test.py foo
ottengo error: too few arguments
. C'è un modo in cui i comandi potrebbero comportarsi come git status
, git commit
o pip install
? O esiste un modo migliore per creare una CLI in Python?
Soluzione
Questo è quello che probabilmente vuoi:
http://docs.python.org/library/argparse.html#sub-commands
Con questo puoi aggiungere sub argomenti che hanno i loro schemi di argomentazioni.
Altri suggerimenti
@crodjer è corretta;
Per fornire un esempio:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands',
description='valid subcommands',
help='additional help')
foo_parser = subparsers.add_parser('foo', help='foo help')
bar_parser = subparsers.add_parser('bar', help='bar help')
bar_parser.add_argument('somearg')
args = parser.parse_args()
Test di diversi Arg per sottoparere:
$ python subparsers_example.py bar somearg Namespace(somearg='somearg') $ python subparsers_example.py foo Namespace() $ python subparsers_example.py foo somearg usage: argparse_subparsers.py foo [-h] subparser_example.py foo: error: unrecognized arguments: somearg
Aiuto Output:
$ python subparsers_example.py foo -h usage: argparse_subparsers.py foo [-h] optional arguments: -h, --help show this help message and exit $ python subparsers_example.py bar -h usage: argparse_subparsers.py bar [-h] somearg positional arguments: somearg optional arguments: -h, --help show this help message and exit
Per impostazione predefinita, gli argomenti di Argparse consumano un valore. Se vuoi che FOO abbia un comportamento diverso, dovrai specificarlo. Sembra che tu pensi che il valore predefinito sia NARGS = 0, ma non lo è. Dalla documentazione di Argparse (a http://docs.python.org/dev/library/argparse.html#nargs): "Se l'argomento della parola chiave NARGS non viene fornito, il numero di argom consumati è determinato dall'azione. Generalmente questo significa che verrà consumato un singolo Arg di comando e verrà prodotto un singolo elemento (non un elenco)."
Puoi usare nargs = '?' Per Foo e dargli un valore predefinito nel caso in cui nulla venga fornito dalla riga di comando o usa un'azione non default (forse 'store_true'?).