getopt —コマンドラインオプション用のCスタイルのパーサー
ソースコード: :source: `Lib / getopt.py`
ノート
getopt モジュールは、コマンドラインオプションのパーサーであり、そのAPIはC getopt()
関数のユーザーに馴染みのあるものになるように設計されています。 C getopt()
関数に慣れていないユーザー、またはコードの記述を減らしてヘルプとエラーメッセージを改善したいユーザーは、代わりに argparse モジュールの使用を検討する必要があります。
このモジュールは、スクリプトがsys.argv
のコマンドライン引数を解析するのに役立ちます。 Unix getopt()
関数と同じ規則をサポートします(「-
」および「--
」の形式の引数の特別な意味を含みます)。 GNUソフトウェアでサポートされているものと同様の長いオプションは、オプションの3番目の引数を介して使用することもできます。
このモジュールは、2つの機能と例外を提供します。
- getopt.getopt(args, shortopts, longopts=[])
コマンドラインオプションとパラメータリストを解析します。 args は、実行中のプログラムへの先行参照なしで解析される引数リストです。 通常、これは
sys.argv[1:]
を意味します。 shortopts は、スクリプトが認識したいオプション文字の文字列であり、引数の後にコロンが必要なオプションがあります(':'
、つまり、Unixgetopt()
と同じ形式です。 ]使用)。ノート
GNU
getopt()
とは異なり、非オプション引数の後、それ以降のすべての引数も非オプションと見なされます。 これは、GNU以外のUnixシステムが機能する方法と似ています。longopts を指定する場合は、サポートする必要のあるlongオプションの名前を含む文字列のリストにする必要があります。 先頭の
'--'
文字をオプション名に含めないでください。 引数が必要な長いオプションの後には等号('='
)を付ける必要があります。 オプションの引数はサポートされていません。 長いオプションのみを受け入れるには、 shortopts を空の文字列にする必要があります。 コマンドラインの長いオプションは、受け入れられたオプションの1つと完全に一致するオプション名のプレフィックスを提供する限り、認識できます。 たとえば、 longopts が['foo', 'frob']
の場合、オプション--fo
は--foo
と一致しますが、--f
は一意に一致しないため、 GetoptError が発生します。戻り値は2つの要素で構成されます。1つ目は
(option, value)
ペアのリストです。 2つ目は、オプションリストが削除された後に残ったプログラム引数のリストです(これは args の末尾のスライスです)。 返される各オプションと値のペアには、最初の要素としてオプションがあり、短いオプションの場合はハイフン('-x'
など)、長いオプションの場合は2つのハイフン('--long-option'
など)が前に付きます。 2番目の要素としてのoption引数、またはオプションに引数がない場合は空の文字列。 オプションは、それらが見つかったのと同じ順序でリストに表示されるため、複数回表示できます。 ロングオプションとショートオプションが混在する場合があります。
- getopt.gnu_getopt(args, shortopts, longopts=[])
この関数は getopt()と同様に機能しますが、GNUスタイルのスキャンモードがデフォルトで使用される点が異なります。 これは、オプション引数と非オプション引数が混在している可能性があることを意味します。 getopt()関数は、オプション以外の引数が検出されるとすぐにオプションの処理を停止します。
オプション文字列の最初の文字が
'+'
の場合、または環境変数POSIXLY_CORRECT
が設定されている場合、オプション以外の引数が検出されるとすぐにオプションの処理が停止します。 。
- exception getopt.GetoptError
- これは、認識されないオプションが引数リストで見つかった場合、または引数を必要とするオプションに何も指定されていない場合に発生します。 例外の引数は、エラーの原因を示す文字列です。 長いオプションの場合、それを必要としないオプションに引数を指定すると、この例外も発生します。 属性
msg
およびopt
は、エラーメッセージと関連オプションを提供します。 例外に関連する特定のオプションがない場合、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"
# ...
if __name__ == "__main__":
main()
argparse モジュールを使用すると、同等のコマンドラインインターフェイスをより少ないコードで、より有益なヘルプとエラーメッセージで作成できることに注意してください。
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 ..