Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのgetoptモジュールでCスタイルのコマンドラインオプションを解析する方法

コマンドライン引数へのアクセス(sys.argv)

Pythonでは、標準ライブラリのsysモジュールを使うことで、コマンドラインから渡された任意の引数にアクセスできます。sys.argvはコマンドライン引数のリストであり、sys.argv[0]には実行中のプログラム(スクリプト名)が格納されます。

まず、以下のコードをargs.pyという名前で保存してください。

import sys
print ('argument list', sys.argv)

このスクリプトをコマンドラインから次のように実行してみましょう。

C:\python37>python args.py 11 22
argument list ['args.py', '11', '22']

このように、スクリプト名に続いて渡された引数がリストとして取得できることが確認できます。

getoptモジュールとは

getoptモジュールには、sys.argv内のコマンドライン引数を解析するための関数が用意されています。このモジュールは、Unixのgetopt()関数と同じ規約(「-」や「--」で始まる引数の特別な意味を含む)をサポートしており、APIもC言語のgetopt()関数に慣れ親しんだユーザーにとって分かりやすい設計になっています。

getopt(args, shortopts, longopts=[])

この関数は、コマンドラインオプションとパラメータリストを解析します。argsには、実行中のプログラム名であるsys.argv[0]を除いた引数リスト、つまり通常はsys.argv[1:]を指定します。各引数の意味は以下のとおりです。

  • shortopts: スクリプトが認識するオプション文字の文字列です。引数を必要とするオプションの後ろにはコロン(:)を付けます(Unixのgetopt()と同じ形式)。
  • longopts: 指定する場合は、サポートしたいロングオプション名の文字列のリストです。先頭の「--」は含めません。引数を必要とするロングオプションの後ろには等号(=)を付けます。

戻り値

戻り値は2つの要素で構成されます。

  • 1つ目は(option, value)ペアのリスト
  • 2つ目は、オプション部分を取り除いた後に残ったプログラム引数のリスト(argsの末尾のスライス)

返される各option-valueペアでは、第1要素がオプション名で、ショートオプションならハイフン1つ(例:「-x」)、ロングオプションならハイフン2つ(例:「--long-option」)が先頭に付きます。第2要素はオプションの引数で、引数がない場合は空文字列になります。オプションは見つかった順序でリストに格納されるため、同じオプションが複数回現れるケースにも対応でき、ショートオプションとロングオプションを混在させて指定することも可能です。

なお、引数リストの中に認識できないオプションが存在した場合や、引数を必要とするオプションに引数が与えられなかった場合には、GetoptError例外が発生します。

使用例

以下は、入力ファイルと出力ファイルの指定を受け付けるスクリプトの完全な例です。

import sys, getopt

args=sys.argv[1:]
inputfile = ''
outputfile = ''
try:
    opts, args = getopt.getopt(args,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
    print ('test.py -i <inputfile> -o <outputfile>')
    sys.exit(2)
for opt, arg in opts:
    if opt == '-h':
        print ('args.py -i <inputfile> -o <outputfile>')
        sys.exit()
    elif opt in ("-i", "--ifile"):
        inputfile = arg
    elif opt in ("-o", "--ofile"):
        outputfile = arg
print ('Input file is "', inputfile)
print ('Output file is "', outputfile)

この例では、ショートオプションとして「-h」「-i」「-o」を、ロングオプションとして「--ifile」「--ofile」を定義しています。「-i」と「-o」の後ろにコロン(:)があるのは、それぞれ引数(ファイル名)が必要なことを示しています。

実行結果

C:\python37>python args.py -h
args.py -i <inputfile> -o <outputfile>
C:\python37>python args.py -i abc.txt -o xyz.txt
Input file is " abc.txt
Output file is " xyz.txt
C:\python37>python args.py --ifile=abc.txt --ofile=xyz.txt
Input file is " abc.txt
Output file is " xyz.txt

このように、ショートオプション形式(-i abc.txt)でもロングオプション形式(--ifile=abc.txt)でも、同じようにオプションを解析できることが分かります。より高度なコマンドライン処理が必要な場合は、argparseモジュールの利用も検討するとよいでしょう。

  1. コマンドラインから操作するPython Matplotlibのインタラクティブプロット入門

    Matplotlibでインタラクティブなプロットを実現するには、図(figure)をアクティブな状態にしておく必要があります。plt.ioff() と plt.ion() を使い分けることで、プロットに対するインタラクティブな操作の有効・無効を自由に切り替えることができます。 それでは、IPython シェルを起動し、以下のコマンドを順番に入力して動作を確認してみましょう。 実行例 In [1]: %matplotlib auto Using matplotlib backend: GTK3Agg In [2]: import matplotlib.pyplot as In [3]: fi

  2. PythonでTkinterボタンのコマンド(イベントハンドラ)を動的に変更する方法

    TkinterのButtonウィジェットは、アプリケーション内で特定の操作を実行するためのイベントを処理する役割を担っています。こうしたイベントに対応するには、通常、実行したい処理をまとめたメソッド(関数)を定義し、ボタンのcommandオプションに割り当てます。しかし、ボタンを作成した後から、クリック時に実行される処理(イベントメソッド)を変更したい場合もあるでしょう。そんなときに便利なのが、configure(options)メソッドです。このメソッドを使えば、ボタンウィジェットの設定を後から自由に再構成でき、新しいメソッドを定義してボタンに割り当てることで、同じボタンでも状況に応じてまっ