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

È stato utile?

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.

optparse è il tuo migliore amico per l'analisi della riga di comando. Anche prendere in considerazione argparse ; non è nella libreria standard, però.

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 .

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