Pythonのgetoptモジュールの使い方|コマンドラインの引数を解析する方法を解説

スポンサーリンク

今回は、コマンドライン引数をサポートする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 は残りの引数をオプションとして処理するのを止めます。

Longterm

getopt.GetoptErrorで例外を処理する

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

Error

Pythonのargparseモジュールは、より少ないコードでコマンドラインインターフェイスを提供し、より多くのヘルプと有益なエラーメッセージを提供する代替品です。

例外の処理については、こちらをご覧ください。

まとめ

この記事では、optモジュールとその重要な機能、そしてこのモジュールを通してコマンドラインの引数を渡す方法について学びました。

Reference

公式ドキュメント

タイトルとURLをコピーしました