2016-10-12 10 views
5

Kann ich argparse verwenden, um benannte Befehlszeilenargumente zu lesen, die nicht in einer bestimmten Reihenfolge sein müssen? Ich blätterte durch die documentation aber das meiste davon konzentrierte sich auf die Anzeige von Inhalten basierend auf den angegebenen Argumenten (wie --h).Lesen von benannten Befehlsargumenten

Gerade jetzt, mein Skript liest bestellt, unbenannte Argumente:

myscript.py foo-val Bar-val

mit sys.argv:

foo = sys.argv[1] 
bar = sys.argv[2] 

Aber ich möchte um die Eingabe so zu ändern, dass sie ohne Reihenfolge ist, indem Argumente benannt werden:

myscript.py --bar = bar-val --foo = foo-val

+0

keine gute Kopie finden, aber überprüfen Sie hier einige Beispiele: http://stackoverflow.com/questions/11415570/directory- path-types-with-argparse –

Antwort

3

Sie können die Optional Arguments wie so verwenden:

import argparse, sys 

parser=argparse.ArgumentParser() 

parser.add_argument('--bar', help='Do the bar option') 
parser.add_argument('--foo', help='Foo the program') 

args=parser.parse_args() 

print args 
print sys 

Dann, wenn Sie es mit ./prog --bar=bar-val --foo foo-val nennen es druckt:

Namespace(bar='bar-val', foo='foo-val') 
['Untitled 14.py', '--bar=bar-val', '--foo', 'foo-val'] 

Oder, wenn die Nutzer wollen argparse helfen baut das auch:

$ ./prog -h 
usage: Untitled 14.py [-h] [--bar BAR] [--foo FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    --bar BAR Do the bar option 
    --foo FOO Foo the program 
+0

Ich wusste nicht, dass es möglich ist, die '--opt = val'-Syntax zu verwenden. Das ist wunderbar :) – Tryph

+0

Wie lese ich den Wert von 'foo' nachdem die Argumente geladen wurden? – amphibient

+0

ist da wie 'args.get ('foo')'? – amphibient

2

Die Antwort ist ja . Ein kurzer Blick auf the argparse documentation hätte auch geantwortet.

Hier ist ein sehr einfaches Beispiel, argparse ist in der Lage, viel spezifischere Bedürfnisse zu behandeln.

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', '-f', help="a random options", type= str) 
parser.add_argument('--bar', '-b', help="a more random option", type= int, default= 0) 

print(parser.format_help()) 
# usage: test_args_4.py [-h] [--foo FOO] [--bar BAR] 
# 
# optional arguments: 
# -h, --help   show this help message and exit 
# --foo FOO, -f FOO a random options 
# --bar BAR, -b BAR a more random option 

args = parser.parse_args("--foo pouet".split()) 
print(args) # Namespace(bar=0, foo='pouet') 
print(args.foo) # pouet 
print(args.bar) # 0 

Weg vom Kurs in einem echten Skript, werden Sie nicht hart Code der Befehlszeilenoptionen und parser.parse_args() (ohne Argument) nennen statt. Es wird Argarse die sys.args Liste als Befehlszeilenargumente nehmen.

können Sie dieses Skript nennen diese Art und Weise:

test_args_4.py -h # prints the help message 
test_args_4.py -f pouet # foo="pouet", bar=0 (default value) 
test_args_4.py -b 42 # foo=None, bar=42 
test_args_4.py -b 77 -f knock # foo="knock", bar=77 

Sie werden durch das Lesen der doc eine Menge anderer Features entdecken;)

+0

aber in Ihrem Skript wissen Sie nicht, dass 'pouet' als Arg-Wert übergeben wird – amphibient

+2

Große Antwort. Es wäre besser ohne die RTM Kommentare ... – dawg

+0

@amphibient Ich verstehe nicht, was du meinst ... – Tryph

Verwandte Themen