今回は、コマンドライン引数をサポートするgetoptモジュールについて理解します。
では、さっそく始めましょう。
getoptモジュールとは?
getopt モジュールはコマンドライン引数のパーサーであり、Unix の getopt() 関数と同じ機能をサポートします。
その API は C の getopt() 関数と同じように設計されています。
この後のデモでは,sysモジュールを使ってsys.argv関数でプログラムに渡された引数を読み,getoptモジュールでその引数をパースすることにします.
- sys.argv : コマンドライン引数のリスト
 - len(sys.argv): コマンドライン引数の個数
 
import sys
number=len(sys.argv)
arguments=str(sys.argv)
print ('The Number of arguments:', number, 'arguments.')
print ('Argument List:', arguments)
 | 
結果は以下の通りです。
C:UsersTanushree ThapliyalDesktop>py yess.py A1 B2 C3 D4The Number of arguments: 5 arguments.Argument List: ['yess.py', 'A1', 'B2', 'C3', 'D4'] | 
0番目のインデックスがスクリプト名で、引数の数にカウントされます。
getopt モジュールの関数のデモンストレーション
ここで、getoptモジュールの例をいくつか見てみましょう。
一般的な関数のうちの2つをデモします。
1. getopt.getopt() によるコマンドラインオプションとパラメータリストの解析
getopt()`関数は、コマンドラインオプションとパラメータリストを解析します。
この関数は3つの引数を受け付けます。
- args は渡される引数リストです。
 - shortoptsはスクリプトが認識したいオプションの文字列です。
 - longopts は、サポートされるべき長いオプションの名前を持つ文字列のリストです。
 
オプションリストを取り除いた後に残った(オプション,値)のペアのリストとプログラム引数のリストが返される。
import sys
import getopt
args=sys.argv[1:]
inputfile = ''
outputfile = ''
try:
   opts, args = getopt.getopt(args,"hi:o:",["infile=","outfile="])
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", "--infile"):
      inputfile = arg
   elif opt in ("-o", "--outfile"):
      outputfile = arg
print ('Input file is "', inputfile)
print ('Output file is "', outputfile)
 | 
引数として、 --infile と --outfile を受け付けるとともに、 -i と -o という引数も受け付けます。
注意: 上記のデモは、引数を一切処理しません。
このデモの目的は、getoptモジュールが引数を解析し、インライン引数を簡単に扱えるようにすることを示すことです。
ここで、sys.argv[1:]とは、sys.argv[0]がアクセスの必要のないスクリプト名なので、開始インデックスが1であることを意味しています。
CASE 1: シングルダッシュ(‘ – ‘)と短い形式の -i と -o を使用します。
結果は以下の通りです。
py python.py -i=abc.txt -o=xyz.txt
Input file is " abc.txt
Output file is " xyz.txt
 | 
CASE 2: ダブルダッシュ( ‘ – ‘)と引数の長い形式を使用する場合
出力:
py python.py --infile=abc.txt --outfile=xyz.txt
Input file is " abc.txt
Output file is " xyz.txt
 | 
import getopt
import sys
category = '1.0'
fix = False
output_file = 'abc.txt'
print ('ARGV      :', sys.argv[1:])
options, remainder = getopt.gnu_getopt(sys.argv[1:], 'o:f', ['output=','fix', 'category='])
print ('OPTIONS   :', options)
for opt, arg in options:
    if opt in ('-o', '--output'):
        output_filename = arg
    elif opt in ('-f', '--fix'):
        fix = True
    elif opt == '--category':
        category = arg
         print ('category   :', category)
print ('fix        :',fix)
print ('output    :', output_file)
print ('remaining :', remainder)
 | 
2. gnu_getopt()関数によるGNUスタイルのパージング
GNUスタイルの解析には getopt.gnu_getopt() 関数が使用されます。
その動作は getopt() 関数と似ていますが、この場合、デフォルトで GNU スタイルの解析が行われるため、オプションと非オプションの引数を混在させることが可能です。
py yess.py -f not_an_option --output foo
ARGV      : ['-f', 'not_an_option', '--output', 'foo']
OPTIONS   : [('-f', ''), ('--output', 'foo')]
category   : 1.0
fix        : True
output    : abc.txtremaining : ['not_an_option']
 | 
結果は以下の通りです。
ARGV      : []OPTIONS   : []category   : 1.0
fix        : False
output    : abc.txtremaining : [] | 
また、このコードは引数を渡さずに実行することもできます。
py yess.py -f -- --output foo
ARGV      : ['-f', '--', '--output', 'foo']
OPTIONS   : [('-f', '')]
category   : 1.0
fix        : True
output    : abc.txtremaining : ['--output', 'foo']
 | 
引数に ‘ – ‘ が渡された場合、getopt は残りの引数をオプションとして処理するのを止めます。

getopt.GetoptErrorで例外を処理する
引数リストに認識されたオプションが見つからない場合、または引数を必要とするオプションに何も与えられない場合、例外エラーが発生します。

Pythonのargparseモジュールは、より少ないコードでコマンドラインインターフェイスを提供し、より多くのヘルプと有益なエラーメッセージを提供する代替品です。
例外の処理については、こちらをご覧ください。
まとめ
この記事では、optモジュールとその重要な機能、そしてこのモジュールを通してコマンドラインの引数を渡す方法について学びました。
Reference
公式ドキュメント