2009-02-20 12 views
23

Was wäre ein einfacher Ausdruck, um Befehlszeilenargumente zu verarbeiten, wenn ich etwas wie 001 oder 999 erwarte (lassen wir die Erwartungen auf 001 ... 999 Bereich für diese Zeit begrenzen), und einige andere Argumente bestanden und möchten ignorieren Irgendwelche unerwarteten?Wie kann ich Befehlszeilenargumente in Python verarbeiten?

Ich verstehe, wenn zum Beispiel muss ich, wenn „debug“ finden sich unter Parameter übergeben wurde wird es so ähnlich sein:

if 'debug' in argv[1:]: 
    print 'Will be running in debug mode.' 

Wie um herauszufinden, ob 009 oder 575 übergeben wurde?

Alle, erwartet Anrufe:

python script.py 
python script.py 011 
python script.py 256 debug 
python script.py 391 xls 
python script.py 999 debug pdf 

An diesem Punkt ist mir egal, über Anrufe wie folgt aus:

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

... erste - wegen mehr als eine „numerische " Streit; Zweitens - wegen ... na ja, unerwarteten Argumenten; drittens und viertens - wegen der nicht dreistelligen Argumente.

+0

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

Antwort

29

Wie andere beantwortet, ist optparse die beste Option, aber wenn Sie nur schnell Code wollen versuchen, etwas wie folgt aus:

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: Hier ist ein optparse Beispiel, weil so viele Menschen ohne wirklich beantworten optparse Erklären Sie warum oder erklären Sie, was Sie ändern müssen, damit es funktioniert.

Der Hauptgrund für die Verwendung von optparse ist die größere Flexibilität für die spätere Erweiterung und die Flexibilität in der Befehlszeile. Mit anderen Worten, Ihre Optionen können in beliebiger Reihenfolge angezeigt werden und Verwendungsbenachrichtigungen werden automatisch generiert. Um es jedoch mit optparse arbeiten zu können, müssen Sie Ihre Spezifikationen ändern, um '-' oder '-' vor die optionalen Argumente zu setzen, und Sie müssen alle Argumente in beliebiger Reihenfolge zulassen.

Also hier ist ein Beispiel unter Verwendung von 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' 

Die Unterschiede hier mit optparse und Ihre Spezifikation ist, dass Sie jetzt Befehlszeilen wie haben:

python script.py --debug --xls 001 

und Sie können leicht neue Optionen hinzufügen durch Aufruf von parser.add_option()

+4

aber beachten Sie: optparse wurde "veraltet seit [Python] Version 2.7: Das optparse-Modul ist veraltet und wird nicht weiterentwickelt, die Entwicklung wird mit dem argparse-Modul fortgesetzt." Siehe: http://docs.python.org/2/library/optparse.html – kkurian

15

Schauen Sie sich das Modul optparse an. Der Umgang mit sys.argv selbst ist in Ordnung für wirklich einfache Dinge, aber es gerät schnell außer Kontrolle.

Beachten Sie, dass Sie möglicherweise optparse einfacher zu verwenden finden, wenn Sie Ihr Argument Format ein wenig ändern können; z.B. Ersetzen Sie debug durch --debug und xls durch --xls oder --output=xls.

+0

Ich bin nicht sicher, dass dies es lohnt sich, wenn das OP nur Argumente verwendet, keine Optionen. –

+4

Beachten Sie, dass optparse wurde ersetzt durch [argparse] (http://docs.python.org/library/argparse.html#module-argparse) –

2

optparse ist Ihr bester Freund für das Parsen der Befehlszeile. Schauen Sie auch in argparse; Es ist jedoch nicht in der Standardbibliothek.

+2

Nur als eine Notiz [argparse] (http://docs.python.org /2.7/library/argparse.html) ist jetzt Standard in Python 2.7 und scheint sogar auf 2.6.8 portiert worden zu sein. Laut der [optparse-Dokumentation] (http://docs.python.org/2/library/optparse.html) ist optparse jetzt veraltet. –

2

Wenn Sie tatsächliche Befehlszeilenschalter implementieren möchten, geben Sie getopt einen Blick. Es ist unglaublich einfach zu benutzen.

+0

Ich würde nicht sagen, getopt ist alles so einfach - sicher, es ist besser als das Parsen manuell, aber es ist nur ein Port von einigen C-Code das nutzt Pythons Stärken nicht wirklich aus. Ich würde fast immer optparse über getopt empfehlen. –

0

Van Gale ist weitgehend korrekt bei der Verwendung des regulären Ausdrucks gegen das Argument. Es ist jedoch NICHT absolut notwendig, alles zu einer Option zu machen, wenn optparse verwendet wird, die sys.argv in Optionen und Argumente aufteilt, basierend darauf, ob ein "-" oder "-" vorangestellt ist oder nicht. Einiger Beispiel-Code zu durchlaufen nur die Argumente:

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) 

Ja, der args-Array wird analysiert, viel die gleiche Art und Weise wie sys.argv wäre, aber die Fähigkeit, leicht Optionen wenn nötig hinzugefügt worden ist. Für mehr über optparse, überprüfen Sie die relevant Python doc.

Verwandte Themen