2009-02-20 15 views
23

Quale sarebbe un'espressione semplice per elaborare gli argomenti della riga di comando se mi aspetto qualcosa come 001 o 999 (limitiamo le aspettative all'intervallo 001 ... 999 per questa volta) e pochi altri argomenti passati e vorrei ignorare qualsiasi inaspettato?Come posso elaborare gli argomenti della riga di comando in Python?

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?

chiamate Tutti coloro che 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 importa di chiamate del genere:

python script.py 001 002 245 568 
python script.py some unexpected argument 
python script.py 0001 
python script.py 02 

... primo - a causa di più di un "numerico " discussione; secondo - a causa di ... bene, argomenti inaspettati; terzo e quarto - a causa di argomenti non a 3 cifre.

+0

check out questa http://stackoverflow.com/questions/25605380/passing-directory-to-python-script-as-command-line-argument/25605529#25605529 –

risposta

29

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' 

EDIT: Ecco un esempio optparse perché così tante persone stanno rispondendo optparse senza realmente spiegando perché, o spiegando cosa devi cambiare per farlo funzionare.

Il motivo principale per utilizzare optparse è che offre più flessibilità per l'espansione in un secondo momento e offre maggiore flessibilità sulla riga di comando. In altre parole, le tue opzioni possono apparire in qualsiasi ordine e i messaggi di utilizzo vengono generati automaticamente. Tuttavia, per farlo funzionare con optparse è necessario modificare le specifiche per inserire '-' o '-' davanti agli argomenti opzionali e devi 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()

+4

ma nota: optparse è stato "deprecato da [Python] versione 2.7: il modulo optparse è deprecato e non verrà ulteriormente sviluppato, lo sviluppo continuerà con il modulo argparse." Vedi: http://docs.python.org/2/library/optparse.html – kkurian

15

Dai un'occhiata al modulo optparse. Affrontare sys.argv va bene per cose davvero semplici, ma diventa rapidamente fuori controllo.

Nota che puoi trovare optparse più facile da usare se puoi modificare un po 'il tuo argomento; per esempio. sostituire debug con --debug e xls con --xls o --output=xls.

+0

io non sono sicuro che questo è ne vale la pena quando l'OP sta usando solo argomenti, non opzioni. –

+4

Si noti che optparse è stato sostituito con [argparse] (http://docs.python.org/library/argparse.html#module-argparse) –

2

optparse è il tuo migliore amico per analizzare la riga di comando. Guarda anche su argparse; non è nella libreria standard, però.

+2

Proprio come una nota [argparse] (http://docs.python.org /2.7/library/argparse.html) è ora standard in Python 2.7 e sembra addirittura essere stato portato su 2.6.8. Secondo la [documentazione optparse] (http://docs.python.org/2/library/optparse.html), optparse è ora deprecato. –

2

Se si desidera implementare effettivi switch da riga di comando, dare un'occhiata a getopt. È anche incredibilmente semplice da usare.

+0

Non direi che getopt è tutto così semplice - certo, è meglio che fare l'analisi manualmente, ma è solo una porta di qualche codice C ciò non sfrutta realmente i punti di forza di Python. Consiglierei quasi sempre optparse over getopt. –

0

Van Gale è ampiamente corretto nell'uso dell'espressione regolare rispetto all'argomento. Tuttavia, NON è assolutamente necessario rendere tutto un'opzione quando si utilizza optparse, che divide sys.argv in opzioni e argomenti, in base al fatto che un "-" o "-" sia davanti o no. 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 ulteriori informazioni su optparse, consulta lo relevant Python doc.

Problemi correlati