getopt — 命令列選項的 C 風格解析器

原始碼: Lib/getopt.py

注意

此模組被認為是功能完整的。 optparse 模組中提供了此 API 的更具宣告性和可擴充套件性的替代方案。命令列引數處理的進一步功能增強作為 PyPI 上的第三方模組提供,或者作為 argparse 模組的功能提供。


此模組幫助指令碼解析 sys.argv 中的命令列引數。它支援與 Unix getopt() 函式相同的約定(包括 ‘-’ 和 ‘--’ 形式的引數的特殊含義)。類似於 GNU 軟體支援的長選項也可以透過可選的第三個引數使用。

不熟悉 Unix getopt() 函式的使用者應該考慮使用 argparse 模組。熟悉 Unix getopt() 函式,但希望在編寫更少程式碼並獲得更好的幫助和錯誤訊息的同時獲得等效行為的使用者應該考慮使用 optparse 模組。有關更多詳細資訊,請參閱 選擇引數解析庫

此模組提供兩個函式和一個異常

getopt.getopt(args, shortopts, longopts=[])

解析命令列選項和引數列表。 args 是要解析的引數列表,不包括對正在執行的程式的引導引用。通常,這意味著 sys.argv[1:]shortopts 是指令碼要識別的選項字母的字串,需要引數的選項後跟冒號 (':';即,與 Unix getopt() 使用的格式相同)。

注意

與 GNU getopt() 不同,在非選項引數之後,所有後續引數也被視為非選項。這類似於非 GNU Unix 系統的工作方式。

longopts(如果指定)必須是包含應支援的長選項名稱的字串列表。前導的 '--' 字元不應包含在選項名稱中。需要引數的長選項後應跟等號 ('=')。不支援可選引數。要僅接受長選項,shortopts 應該是一個空字串。只要長選項提供與接受的選項之一完全匹配的選項名稱的字首,就可以識別命令列上的長選項。例如,如果 longopts['foo', 'frob'],則選項 --fo 將匹配為 --foo,但 --f 將不會唯一匹配,因此將引發 GetoptError

返回值包含兩個元素:第一個是 (option, value) 對的列表;第二個是剝離選項列表後剩餘的程式引數列表(這是 args 的尾部切片)。返回的每個選項和值對都以選項作為其第一個元素,短選項帶有連字元字首(例如,'-x'),長選項帶有兩個連字元字首(例如,'--long-option'),以及選項引數作為其第二個元素,如果選項沒有引數,則為空字串。選項在列表中出現的順序與它們被找到的順序相同,從而允許多次出現。長選項和短選項可以混合使用。

getopt.gnu_getopt(args, shortopts, longopts=[])

此函式的工作方式類似於 getopt(),只是預設情況下使用 GNU 風格的掃描模式。這意味著選項引數和非選項引數可以混合使用。 getopt() 函式在遇到非選項引數時會立即停止處理選項。

如果選項字串的第一個字元是 '+',或者如果設定了環境變數 POSIXLY_CORRECT,則在遇到非選項引數時會立即停止選項處理。

exception getopt.GetoptError

當在引數列表中找到無法識別的選項或當需要引數的選項未給出引數時,會引發此異常。異常的引數是一個指示錯誤原因的字串。對於長選項,如果給不需要引數的選項提供引數也會導致引發此異常。屬性 msgopt 提供錯誤訊息和相關選項;如果沒有與異常相關的特定選項,則 opt 是一個空字串。

exception getopt.error

GetoptError 的別名;為了向後相容。

僅使用 Unix 風格選項的示例

>>> 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']

使用長選項名稱同樣容易

>>> 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']

在指令碼中,典型的用法如下所示

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"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()

請注意,透過使用 optparse 模組,可以使用更少的程式碼和更豐富的資訊性幫助和錯誤訊息來生成等效的命令列介面

import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)

在這種情況下,也可以使用 argparse 模組生成大致等效的命令列介面

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)

有關此程式碼的 argparse 版本與 optparse (和 getopt)版本在行為上的差異的詳細資訊,請參閱 選擇引數解析庫

另請參閱

模組 optparse

宣告式命令列選項解析。

模組 argparse

更具主見的命令列選項和引數解析庫。