簡體   English   中英

參數的順序在getopt中很重要

[英]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計為參數值),則放棄其參數值,然后移至下一個參數。

最后,關於getoptargparse 該文檔明確提倡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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM