![](/img/trans.png)
[英]Handling arguments in order for preprocessing in Python, when order matters
[英]Order of the arguments matters in 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
這令人失望,因為參數的順序無關緊要,應該嗎? 有什么辦法解決嗎?
更新:
python my_app.py -aa value1 # odd, empty { "-a" : "" }
python my_app.py -a value1 # even this empty { "-a" : "" }
如對問題的第一條評論所述,關於以不同順序對參數進行失敗解析的主要示例運行良好:
~/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
的文檔中 ,我特別強調:
options是腳本要識別的選項字母的字符串,選項需要一個參數,后跟一個冒號。
因此,當getopt
解析您的參數時,每次遇到-a
參數時,它將它與它注意到的第a
選項相關聯,在您的情況下,該選項后沒有冒號。 因此,它設置了該選項,如果有的話(如果-aa
作為腳本的參數傳遞,則第二個a
計為參數值),則放棄其參數值,然后移至下一個參數。
最后,關於getopt
和argparse
。 該文檔明確提倡argparse
:
getopt模塊是命令行選項的解析器,其API設計為C getopt()函數的用戶熟悉。 不熟悉C getopt()函數或希望編寫更少代碼並獲得更好幫助和錯誤消息的用戶,應考慮改用argparse模塊。
有關為何argparse
優於getopt
和已棄用的optparse
可以在本PEP和該問題的答案中閱讀。
我發現在argparse
需要一些工作的同時, getopt
支持的唯一功能是參數順序排列,例如gnu getopt
。 但是, 此問題說明了如何通過argparse
實現此目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.