Anforderungsüberprüfung
- benutze
argparse
(ich werde diesen ignorieren)
- Lassen Sie eine oder zwei Aktionen aufrufen (mindestens eine erforderlich).
- versuche es mit Pythonic (ich würde es lieber "POSIX" -ähnlich nennen)
Es gibt auch einige implizite Anforderungen, wenn Sie in der Befehlszeile leben:
- Erklären Sie dem Benutzer die Verwendung auf leicht verständliche Weise
- Optionen sind optional
- Ermöglichen die Angabe von Flags und Optionen
- Ermöglichen das Kombinieren mit anderen Parametern (wie Dateiname oder Namen).
Beispiellösung mit docopt
(Datei managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Versuchen Sie es auszuführen:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Zeigen Sie die Hilfe:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
Und benutze es:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Kurze Alternative short.py
Es kann noch kürzere Varianten geben:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Die Verwendung sieht folgendermaßen aus:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Beachten Sie, dass anstelle von booleschen Werten für die Schlüssel "process" und "upload" Zähler vorhanden sind.
Es stellt sich heraus, dass wir die Verdoppelung dieser Wörter nicht verhindern können:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Schlussfolgerungen
Das Entwerfen einer guten Befehlszeilenschnittstelle kann manchmal eine Herausforderung sein.
Es gibt mehrere Aspekte eines befehlszeilenbasierten Programms:
- gutes Design der Kommandozeile
- Auswahl / Verwendung des richtigen Parsers
argparse
bietet viel, schränkt aber mögliche Szenarien ein und kann sehr komplex werden.
Die docopt
Dinge werden viel kürzer, während die Lesbarkeit erhalten bleibt und ein hohes Maß an Flexibilität geboten wird. Wenn Sie es schaffen, analysierte Argumente aus dem Wörterbuch abzurufen und einige Konvertierungen (in Ganzzahlen, Öffnen von Dateien ...) manuell (oder in einer anderen aufgerufenen Bibliothek schema
) docopt
durchzuführen, ist die Analyse der Befehlszeile möglicherweise gut geeignet.
-x
ist universell eine Flagge und optional. Schneiden Sie die,-
wenn es erforderlich ist.