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 someargMa 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?

È stato utile?

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'?).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top