Sie sind für argparse Lösung gefragt, aber wie Sie auch für eine Lösung Pythonic nennen, ich werde eine alternative Verwendung Paket docopt
absichtlich schlagen:
bekommen es:
$ pip install docopt
Code schreiben in mycommand
Datei:
"""
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
print args
es dann von der Kommandozeile aufrufen:
grundlegende Hilfe (keine Argumente):
$ python mycommand
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
für eine Hilfe Vorstellung:
$ python mycommand -h
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
Mit subcommand kompilieren:
$ python mycommand compile zoneAlfa zoneBeta
{'--disable': False,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
Flagge hinzufügen disable:
$ python mycommand compile --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
Start subcommand funktioniert auch:
$ python mycommand launch --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': False,
'launch': True}
Meine Verwendung des Argument Parser begann mit argparse auch, und ich hasste die Komplexität des Codes, die für etwas zu tun brauchen.
Später verwandelte ich mich in plac
, die sehr effiziente Möglichkeit ist, eine Python-Funktion in sehr brauchbare Befehle für die Konsole zu verwandeln.
Dennoch war ich durch Regeln begrenzt zu folgen und zu verstehen, die mir in vielen Fällen nicht sehr klar waren. Mit docopt
schätze ich, dass ich den Docstring zuerst schreiben kann, den Standardregeln von POSIX folgend, und es dann in meinem Code verwende. Wenn Sie sich für die Validierung von Argumenten interessieren, werde ich Sie zu Beispielen dieses großartigen Pakets führen.
„Ich würde die globalen Flags mögen * arbeiten, ob sie vor oder nach dem subcommand *.“ Ich glaube, diese Lösung funktioniert nicht, wenn die Fahnen vor dem vorgesehen sind Unterbefehl in der Befehlszeile. Ich habe * auch * versucht, das base_subparser als Elternteil zum obersten Parser anzuwenden, aber dieses verhält sich schlecht für erforderlich = zutreffende Argumente. – Weeble