2014-09-23 66 views
0
參數事宜

我的應用程序解析命令行參數:秩序的getopt

import sys 
import getopt 

arguments = sys.argv[1:] 
options, remainder = getopt.getopt(arguments, "aa:bb:cc:dd:h", ["aaaa=", "bbbb=", "cccc=", "dddd=", "help"]) 

print dict(options) 

這個偉大的工程,但同時奇怪的:如果我把參數在不同的順序,他們沒有得到解析

python my_app.py --aaaa=value1 --bbbb=value2 --cccc=value3 --dddd=value4 #ok 
python my_app.py --dddd=value4 --bbbb=value2 --cccc=value3 --aaaa=value1 # empty 

這是令人失望的,因爲參數的順序應該不重要,應該嗎?有什麼辦法可以解決這個問題嗎?

UPDATE:

python my_app.py -aa value1 # odd, empty { "-a" : "" } 
python my_app.py -a value1 # even this empty { "-a" : "" } 
+2

適合我。你如何填充論據? – user3885927 2014-09-23 23:59:45

+1

你在什麼版本的Python?如果你有3.2或更高版本,[argparse](https://docs.python.org/3/library/argparse.html)是一個好方法,比getopt更靈活。 – Ajean 2014-09-24 00:00:53

+0

@ user3885927,我剛給你看。你什麼意思? – 2014-09-24 00:16:58

回答

1

正如你的問題第一個評論說,您對的參數解析失敗以不同的順序主要的例子非常有效:

~/tmp/so$ python my_app.py --aaaa=value1 --bbbb=value2 --cccc=value3 --dddd=value4 
{'--aaaa': 'value1', '--cccc': 'value3', '--dddd': 'value4', '--bbbb': 'value2'} 
~/tmp/so$ python my_app.py --dddd=value4 --bbbb=value2 --cccc=value3 --aaaa=value1 
{'--cccc': 'value3', '--bbbb': 'value2', '--aaaa': 'value1', '--dddd': 'value4'} 

如果這不是對於您的情況,請更新腳本以打印剩餘部分,並顯示其輸出。

但是,您仍然錯用了getopt庫,這就是您提供的最新示例未按預期工作的原因。您不能指定多個單個字符作爲選項,因爲第二個字符將被視爲一個新的單獨選項。 getopt沒有辦法區分兩個連續的字符,這兩個連續的字符被視爲單個選項(第一個沒有參數值,因爲它後面沒有冒號),或者是由兩個字符組成的單個選項。從getopt.getopt's documentation,我加上強調:

期權是期權的字母腳本要認識到,與那些需要參數,後跟一個冒號的選項字符串。

因此,當getopt解析你的論點,每次遇到一個-a參數,它與它的第一a選擇它注意到,而你的情況是不是跟一個冒號關聯。因此,它設置這個選項,放棄它的參數值,如果有的話(如果-aa作爲參數傳遞給腳本,第二個a作爲參數值),並移動到下一個參數。

最後,關於getoptargparseThe documentation clearly advocates argparse

getopt模塊是命令行選項的解析器,其API被設計爲C getopt()函數的用戶熟悉的。不熟悉C getopt()函數的用戶,或者希望編寫更少代碼並獲得更好幫助和錯誤消息的用戶應該考慮使用argparse模塊。

更多關於爲什麼​​比都getopt和棄用optparse可以更好地在this PEP和答案this question讀取。
我發現在getopt中支持的唯一功能是它需要​​中的一些工作,它是像gnu getopt那樣的自變量排列。然而,this question解釋瞭如何通過​​來實現。