getopt
--- C 風(fēng)格的命令行選項(xiàng)解析器?
源代碼: Lib/getopt.py
備注
getopt
模塊是一個(gè)命令行選項(xiàng)解析器,其 API 設(shè)計(jì)會(huì)讓 C getopt()
函數(shù)的用戶(hù)感到熟悉。 不熟悉 C getopt()
函數(shù)或者希望寫(xiě)更少代碼并獲得更完善幫助和錯(cuò)誤消息的用戶(hù)應(yīng)當(dāng)考慮改用 argparse
模塊。
此模塊可協(xié)助腳本解析 sys.argv
中的命令行參數(shù)。 它支持與 Unix getopt()
函數(shù)相同的慣例(包括形式如 '-
' 與 '--
' 的參數(shù)的特殊含義)。 也能通過(guò)可選的第三個(gè)參數(shù)來(lái)使用與 GNU 軟件所支持形式相類(lèi)似的長(zhǎng)選項(xiàng)。
此模塊提供了兩個(gè)函數(shù)和一個(gè)異常:
- getopt.getopt(args, shortopts, longopts=[])?
解析命令行選項(xiàng)與形參列表。 args 為要解析的參數(shù)列表,不包含最開(kāi)頭的對(duì)正在運(yùn)行的程序的引用。 通常這意味著
sys.argv[1:]
。 shortopts 為腳本所要識(shí)別的字母選項(xiàng),包含要求后綴一個(gè)冒號(hào) (':'
;即與 Unixgetopt()
所用的格式相同) 的選項(xiàng)。備注
與 GNU
getopt()
不同,在非選項(xiàng)參數(shù)之后,所有后續(xù)參數(shù)都會(huì)被視為非選項(xiàng)。 這類(lèi)似于非 GNU Unix 系統(tǒng)的運(yùn)作方式。如果指定了 longopts,則必須為一個(gè)由應(yīng)當(dāng)被支持的長(zhǎng)選項(xiàng)名稱(chēng)組成的列表。 開(kāi)頭的
'--'
字符不應(yīng)被包括在選項(xiàng)名稱(chēng)中。 要求參數(shù)的長(zhǎng)選項(xiàng)后應(yīng)當(dāng)帶一個(gè)等號(hào) ('='
)。 可選參數(shù)不被支持。 如果想僅接受長(zhǎng)選項(xiàng),則 shortopts 應(yīng)為一個(gè)空字符串。 命令行中的長(zhǎng)選項(xiàng)只要提供了恰好能匹配可接受選項(xiàng)之一的選項(xiàng)名稱(chēng)前綴即可被識(shí)別。 舉例來(lái)說(shuō),如果 longopts 為['foo', 'frob']
,則選項(xiàng)--fo
將匹配為--foo
,但--f
將不能得到唯一匹配,因此將引發(fā)GetoptError
。返回值由兩個(gè)元素組成:第一個(gè)是
(option, value)
對(duì)的列表;第二個(gè)是在去除該選項(xiàng)列表后余下的程序參數(shù)列表(這也就是 args 的尾部切片)。每個(gè)被返回的選項(xiàng)與值對(duì)的第一個(gè)元素是選項(xiàng),短選項(xiàng)前綴一個(gè)連字符 (例如'-x'
),長(zhǎng)選項(xiàng)則前綴兩個(gè)連字符 (例如'--long-option'
),第二個(gè)元素是選項(xiàng)參數(shù),如果選項(xiàng)不帶參數(shù)則為空字符串。 列表中選項(xiàng)的排列順序與它們被解析的順序相同,因此允許多次出現(xiàn)。 長(zhǎng)選項(xiàng)與短選項(xiàng)可以混用。
- getopt.gnu_getopt(args, shortopts, longopts=[])?
此函數(shù)與
getopt()
類(lèi)似,區(qū)別在于它默認(rèn)使用 GNU 風(fēng)格的掃描模式。 這意味著選項(xiàng)和非選項(xiàng)參數(shù)可能會(huì)混在一起。getopt()
函數(shù)將在遇到非選項(xiàng)參數(shù)時(shí)立即停止處理選項(xiàng)。如果選項(xiàng)字符串的第一個(gè)字符為
'+'
,或者如果設(shè)置了環(huán)境變量POSIXLY_CORRECT
,則選項(xiàng)處理會(huì)在遇到非選項(xiàng)參數(shù)時(shí)立即停止。
- exception getopt.GetoptError?
This is raised當(dāng)參數(shù)列表中出現(xiàn)不可識(shí)別的選項(xiàng)或者當(dāng)一個(gè)需要參數(shù)的選項(xiàng)未帶參數(shù)時(shí)將引發(fā)此異常。 此異常的參數(shù)是一個(gè)指明錯(cuò)誤原因的字符串。 對(duì)于長(zhǎng)選項(xiàng),將一個(gè)參數(shù)傳給不需要參數(shù)的選項(xiàng)也將導(dǎo)致引發(fā)此異常。
msg
和opt
屬性會(huì)給出錯(cuò)誤消息和關(guān)聯(lián)的選項(xiàng);如果沒(méi)有關(guān)聯(lián)到異常的特定選項(xiàng),則opt
將為空字符串。
- exception getopt.error?
GetoptError
的別名;用于向后兼容。
一個(gè)僅使用 Unix 風(fēng)格選項(xiàng)的例子:
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']
使用長(zhǎng)選項(xiàng)名也同樣容易:
>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
... 'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
>>> args
['a1', 'a2']
在腳本中,典型的用法類(lèi)似這樣:
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
except getopt.GetoptError as err:
# print help information and exit:
print(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
output = None
verbose = False
for o, a in opts:
if o == "-v":
verbose = True
elif o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-o", "--output"):
output = a
else:
assert False, "unhandled option"
# ...
if __name__ == "__main__":
main()
請(qǐng)注意通過(guò) argparse
模塊可以使用更少的代碼并附帶更詳細(xì)的幫助與錯(cuò)誤消息生成等價(jià)的命令行接口:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output')
parser.add_argument('-v', dest='verbose', action='store_true')
args = parser.parse_args()
# ... do something with args.output ...
# ... do something with args.verbose ..
參見(jiàn)
- 模塊
argparse
替代的命令行選項(xiàng)和參數(shù)解析庫(kù)。