今回は、コマンドライン引数をサポートする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 D4 The 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.txt remaining : [ 'not_an_option' ]
|
結果は以下の通りです。
ARGV : [] OPTIONS : [] category : 1.0
fix : False
output : abc.txt remaining : [] |
また、このコードは引数を渡さずに実行することもできます。
py yess.py - f - - - - output foo
ARGV : [ '-f' , '--' , '--output' , 'foo' ]
OPTIONS : [( '-f' , '')]
category : 1.0
fix : True
output : abc.txt remaining : [ '--output' , 'foo' ]
|
引数に ‘ – ‘ が渡された場合、getopt は残りの引数をオプションとして処理するのを止めます。
getopt.GetoptErrorで例外を処理する
引数リストに認識されたオプションが見つからない場合、または引数を必要とするオプションに何も与えられない場合、例外エラーが発生します。
Pythonのargparseモジュールは、より少ないコードでコマンドラインインターフェイスを提供し、より多くのヘルプと有益なエラーメッセージを提供する代替品です。
例外の処理については、こちらをご覧ください。
まとめ
この記事では、optモジュールとその重要な機能、そしてこのモジュールを通してコマンドラインの引数を渡す方法について学びました。
Reference
公式ドキュメント