Come posso elaborare gli argomenti della riga di comando in Python?
-
05-09-2019 - |
Domanda
Quale sarebbe un'espressione facile da elaborare gli argomenti della riga di comando, se mi aspetto nulla di simile 001 o 999 (diamo aspettative limite a 001 ... 999 Gamma per questa volta), e pochi altri argomenti passati, e vorrei ignorare qualsiasi imprevisto?
ho capito se per esempio ho bisogno di sapere se "debug" è stata approvata tra i parametri sarà qualcosa del genere:
if 'debug' in argv[1:]:
print 'Will be running in debug mode.'
Come scoprire se 009 o 575 è stata approvata?
Tutte quelle chiamate sono attesi:
python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf
A questo punto non mi interessa sulle chiamate del genere:
python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02
... prima - a causa di più di un argomento "numerico"; secondo - a causa di ... beh, argomenti inaspettati; terzo e quarto -. a causa di argomenti non-3-cifre
Soluzione
Come hanno risposto gli altri, optparse è l'opzione migliore, ma se si desidera solo il codice rapido provare qualcosa di simile:
import sys, re
first_re = re.compile(r'^\d{3}$')
if len(sys.argv) > 1:
if first_re.match(sys.argv[1]):
print "Primary argument is : ", sys.argv[1]
else:
raise ValueError("First argument should be ...")
args = sys.argv[2:]
else:
args = ()
# ... anywhere in code ...
if 'debug' in args:
print 'debug flag'
if 'xls' in args:
print 'xls flag'
Modifica :. Ecco un esempio optparse perché così tante persone stanno rispondendo optparse senza realmente spiegare perché, o spiegare che cosa si deve cambiare per farlo funzionare
Il motivo principale per utilizzare optparse è ti dà una maggiore flessibilità per l'espansione successiva, e ti dà una maggiore flessibilità nella riga di comando. In altre parole, le opzioni possono apparire in qualsiasi messaggio di ordine e di utilizzo vengono generati automaticamente. Tuttavia, per farlo funzionare con optparse è necessario modificare le specifiche di mettere '-' o '-'. Davanti agli argomenti opzionali ed è necessario per consentire a tutti gli argomenti di essere in qualsiasi ordine
Quindi, ecco un esempio utilizzando optparse:
import sys, re, optparse
first_re = re.compile(r'^\d{3}$')
parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()
if len(args) == 1:
if first_re.match(args[0]):
print "Primary argument is : ", args[0]
else:
raise ValueError("First argument should be ...")
elif len(args) > 1:
raise ValueError("Too many command line arguments")
if options.debug:
print 'debug flag'
if options.xls:
print 'xls flag'
Le differenze qui con optparse e la tua spec è che ora è possibile avere righe di comando come:
python script.py --debug --xls 001
e si possono facilmente aggiungere nuove opzioni chiamando parser.add_option ()
Altri suggerimenti
Date un'occhiata alla optparse modulo. Trattare con sys.argv se stessi è bene per cose davvero semplice, ma sfugge di mano rapidamente.
Si noti che si possono trovare optparse più facile da usare, se è possibile modificare il formato di argomento un po '; per esempio. sostituire debug
con --debug
e xls
con --xls
o --output=xls
.
Se si desidera implementare opzioni della riga di comando vero e proprio, dare getopt uno sguardo. E 'incredibilmente semplice da usare, anche.
Van Gale è in gran parte corretto utilizzando l'espressione regolare contro l'argomento. Tuttavia, non è assolutamente necessario per rendere il tutto un'opzione quando si utilizza optparse, che si divide in sys.argv opzioni e gli argomenti, a seconda che un "-" o "-" si trova di fronte o meno. Alcuni codici di esempio per passare attraverso solo gli argomenti:
import sys
import optparse
claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
print "Arguments:"
for arg in args:
print " " + arg
else:
print "No arguments"
sys.exit(0)
Sì, l'array args viene analizzato più o meno allo stesso modo di sys.argv sarebbe, ma la possibilità di aggiungere facilmente le opzioni, se necessario, è stato aggiunto. Per maggiori informazioni su optparse, controllare le rilevanti Python doc .