Pythonスクリプト取得コマンドラインパラメータgetopt,gnu_getopt

8345 ワード

に質問
pythonスクリプトは、オプションおよび非オプションパラメータを含むコマンドラインパラメータを取得する方法です.たとえば、次のようにします.
python client.py -b -t timeout host port
python client.py -h
python client.py --help

関連モジュール
pythonはsysモジュール取得パラメータを提供し、getoptモジュールはパラメータを解析します.
  • sys.argv:スクリプト名自体を含むコマンドラインパラメータ
  • sys.Argv[0]:client.のようなスクリプト名自体py
  • sys.argv[1:]:スクリプト名
  • を含まないコマンドラインパラメータ
  • getopt.getopt():解析コマンドラインパラメータ
  • getopt.gnu_getopt():コマンドラインパラメータを解析し、オプションと非オプションを混在させることができます
  • getopt.Getopterror:コマンドラインパラメータを解析するときの例外名
  • getopt.error:getopt.Getopterrorの別称、下向き互換用
  • 関数のプロトタイプと説明
    getoptとgnu_getoptの原型は以下の通りである:getopt(args,options[,long_options])gnu_getopt(args,options[,long_options])
  • argsはパラメータリストであり、通常sysを用いる.argv[1:]は、myargv=['-t','60','127.0.0.1','8080']
  • のようなパラメータリストを独自に構築することもできる.
  • optionsは、−h,−v,−p 80のような短いパラメータである.
  • long_optionsは、help
  • などの長いパラメータです.
    関数呼び出しの説明
    例として、次のような呼び出しがあります.
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "bht:", ['help','timeout='])
    except getopt.GetoptError as e:
        print e
        sys.exit()
    
  • 「bht:」:1つのオプションがスイッチ状態(追加パラメータなし)を表す場合、分析列にはオプション文字のみが書き込まれます.選択したアイテムに追加パラメータが付いている場合、分析列にオプション文字を書き込み、「:」番号を付けます.だから「bht:」は「b」と「h」がスイッチオプションであることを表す.「t:」は、後にパラメータが付いていることを示します.
  • getoptまたはgnuを呼び出すgetopt関数の場合、関数は2つのリストを返します:optsとargs.optsは解析されたフォーマット情報である.argsは、フォーマット情報に属さない残りのコマンドラインパラメータである.optsは2元グループのリストです.各要素は、(オプション列、追加パラメータ)です.追加パラメータがない場合は空白列'.
  • 長いフォーマットを使用してシリアルリストを解析します:['help','timeout='].ロングフォーマット列にもスイッチ状態があります.すなわち、後ろに「=」番号が付いていません.等号が付いている場合は、後にパラメータがあることを示します.この例では、「help」はスイッチオプションです.「timeout=」は、後にパラメータが付いていることを示します.
  • プロセス全体は、エラーを分析すると、使用方法情報を印刷して、ユーザにこのプログラムの使用方法を通知することができるように、例外を含むために使用される.
  • プログラムを実行する場合、短いフォーマットの場合、「-」番号の後ろにオプションアルファベットが続きます.このオプションの追加パラメータがある場合は、スペースで区切ることも、区切らないこともできます.長さは任意で、引用符を使ってもいいです.以下は正しい:-o-oa-obbbb-o bbb-o'ccc'-o"a b"
  • プログラムを実行する場合、長いフォーマットの場合、「--」番号の後ろに単語が付きます.オプションに追加のパラメータがある場合は、後に「=」に続いてパラメータを追加します.「=」番号の前後にスペースを付けることはできません.または、スペース区切りオプションと追加のパラメータを使用します.以下は正しいです.--timeout=30--timeout 30ですが、これらは正しくありません.--timeout=30--timeout=30--timeout=30--timeout=30--timeout=30--timeout=30--timeout 30
  • getoptとgnu_getoptの違いは、getoptが非オプションパラメータの後、すべてのパラメータが非オプションとして定義されることです.gnu_getoptは、client.py -t 30 127.0.0.1 8080 -b.gnu_getoptはpython 2.3から導入された.
  • 長さオプションは、long_などの可能な限り長く識別されます.optionsが['foo','frob']の場合、--foは--fooに一致します.しかし--fは一致せず,GetoptError異常を放出した.

  • ≪インスタンス|Instance|emdw≫
    #!/usr/bin/env python
    import sys, getopt
    
    timeout = -1
    TS = 0
    bandwidth = 0
    
    def usage():
        print("Usage: %s [OPTION]... [hostname] [port]" % (sys.argv[0]))
        print("  -b                  display bandwidth in bytes")
        print("  -h, --help          print this help and exit")
        print("  -t, --timeout time  connection timeout") 
        print("      --timestamp     display timestamp") 
        print("  -v, --version       print version information and exit") 
    
    print("sys.argv=|%s|" % sys.argv)
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "bht:v", ['help','timeout=','version',"timestamp"])
        print("opts=|%s|" % opts)
        print("args=|%s|" % args)
    except getopt.GetoptError as e:
        print e
        usage()
        sys.exit()
    
    for op, value in opts:
        if op == "-b":
            bandwidth = 1
        if op == "-h" or op == "--help":
            usage()
            sys.exit()
        if op in ("-t","--timeout"):
            timeout = value
        if op == "--timestamp":
            TS = 1
        if op in ("-v","--version"):
            print("%s version: 0.0.1" % sys.argv[0])
            sys.exit()
    
    if len(args) != 2:
        print("no host or port")
        usage()
        sys.exit()
    
    host=args[0]
    try:
        port = int(args[1])
    except ValueError as e:
        print e
        usage()
        sys.exit()
    
    print("timeout=%s, host=%s, port=%d, bandwidth=%d, TS=%d" % (timeout, host, port, bandwidth, TS))
    
    

    検証結果1
    一般的な呼び出し方法
    # python client.py -t 30 -b 127.0.0.1 8080
    sys.argv=|['client.py', '-t', '30', '-b', '127.0.0.1', '8080']|
    opts=|[('-t', '30'), ('-b', '')]|
    args=|['127.0.0.1', '8080']|
    timeout=30, host=127.0.0.1, port=8080, bandwidth=1, TS=0
    

    検証結果2
    オプションと非オプションが混在するシーン
    # python client.py -t 30 127.0.0.1 8080 -b
    sys.argv=|['client.py', '-t', '30', '127.0.0.1', '8080', '-b']|
    opts=|[('-t', '30'), ('-b', '')]|
    args=|['127.0.0.1', '8080']|
    timeout=30, host=127.0.0.1, port=8080, bandwidth=1, TS=0
    

    検証結果3
    追加パラメータのない短いオプションを合わせて書くと、「-b-t」は「-bt」と書くことができます.
    # python client.py -bt 30 127.0.0.1 8080
    sys.argv=|['client.py', '-bt', '30', '127.0.0.1', '8080']|
    opts=|[('-b', ''), ('-t', '30')]|
    args=|['127.0.0.1', '8080']|
    timeout=30, host=127.0.0.1, port=8080, bandwidth=1, TS=0
    [root@test python]# 
    

    検証結果4
    ショートオプションと追加パラメータを合わせて書く
    # python client.py -bt30 127.0.0.1 8080
    sys.argv=|['client.py', '-bt30', '127.0.0.1', '8080']|
    opts=|[('-b', ''), ('-t', '30')]|
    args=|['127.0.0.1', '8080']|
    timeout=30, host=127.0.0.1, port=8080, bandwidth=1, TS=0
    

    検証結果5
    短いオプションのみで、パラメータは追加されていません
    # python client.py -v
    sys.argv=|['client.py', '-v']|
    opts=|[('-v', '')]|
    args=|[]|
    client.py version: 0.0.1
    

    検証結果6
    長いオプションのみで、パラメータは追加されていません
    # python client.py --version
    sys.argv=|['client.py', '--version']|
    opts=|[('--version', '')]|
    args=|[]|
    client.py version: 0.0.1
    

    検証結果7
    --verマッチ--version
    # python client.py --ver
    sys.argv=|['client.py', '--ver']|
    opts=|[('--version', '')]|
    args=|[]|
    client.py version: 0.0.1
    

    検証結果8
    オプションの例外を認識できません
    # python client.py -i
    sys.argv=|['client.py', '-i']|
    option -i not recognized
    Usage: client.py [OPTION]... [hostname] [port]
      -b                  display bandwidth in bytes
      -h, --help          print this help and exit
      -t, --timeout time  connection timeout
          --timestamp     display timestamp
      -v, --version       print version information and exit
    

    検証結果9
    不要な追加パラメータの異常
    # python client.py -t
    sys.argv=|['client.py', '-t']|
    option -t requires argument
    Usage: client.py [OPTION]... [hostname] [port]
      -b                  display bandwidth in bytes
      -h, --help          print this help and exit
      -t, --timeout time  connection timeout
          --timestamp     display timestamp
      -v, --version       print version information and exit
    

    検証結果10
    文字が数値に変換できない例外
    # python client.py 127.0.0.1 8080abc
    sys.argv=|['client.py', '127.0.0.1', '8080abc']|
    opts=|[]|
    args=|['127.0.0.1', '8080abc']|
    invalid literal for int() with base 10: '8080abc'
    Usage: client.py [OPTION]... [hostname] [port]
      -b                  display bandwidth in bytes
      -h, --help          print this help and exit
      -t, --timeout time  connection timeout
          --timestamp     display timestamp
      -v, --version       print version information and exit
    

    検証結果11
    ロングオプションが短すぎて一致しない例外
    # python client.py --time 127.0.0.1 8080
    sys.argv=|['client.py', '--time', '127.0.0.1', '8080']|
    option --time not a unique prefix
    Usage: client.py [OPTION]... [hostname] [port]
      -b                  display bandwidth in bytes
      -h, --help          print this help and exit
      -t, --timeout time  connection timeout
          --timestamp     display timestamp
      -v, --version       print version information and exit