2016-10-12 158 views
5

我可以使用​​讀取不需要按特定順序命名的命令行參數嗎?我瀏覽了documentation,但其中大部分都是基於所提供的參數顯示內容(如--h)。讀命名命令參數

現在,我的腳本讀取命令,未命名的參數:

myscript.py富-VAL酒吧-VAL

使用sys.argv

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

但我想通過命名參數來改變輸入以使其與命令無關:

myscript.py --bar =酒吧-VAL --foo = foo的-VAL

+0

不能找到一個很好的重複,但在這裏獲得一些例子:http://stackoverflow.com/questions/11415570/directory- path-types-with-argparse –

回答

3

可以使用Optional Arguments像這樣:

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 

然後,如果你有./prog --bar=bar-val --foo foo-val叫它它打印:

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

或者,如果用戶想幫助argparse構建太:

$ ./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

我不知道有可能使用'--opt = val'語法。這真是太棒了:) – Tryph

+0

在args被加載後,我如何讀取'foo'的值? – amphibient

+0

有沒有像'args.get('foo')'? – amphibient

2

答案是肯定的。快速瀏覽the argparse documentation也可以回答。

這是一個非常簡單的例子,argparse能夠處理更多的特定需求。

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 

關當然,在一個真正的劇本,你會不會硬代碼的命令行選項,將parser.parse_args()(無參數),而不是打電話。它會使得以列表sys.args作爲命令行參數。

您將可以這樣調用這個腳本:

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 

您將通過閱讀文檔發現很多其他特點的;)

+0

但是在你的腳本中,你不知道'pouet'作爲參數值 – amphibient

+2

傳遞了很好的答案。如果沒有RTM評論會更好...... – dawg

+0

@amphibient我不明白你的意思...... – Tryph