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

Pythonでコマンドライン引数を処理する3つの方法:sys.argv・getopt・argparseの使い方

どのプログラミング言語にも、スクリプトを作成してターミナルから実行したり、他のプログラムから呼び出したりする仕組みが用意されています。スクリプトを実行する際には、スクリプト内の各機能を実行するために必要な引数(パラメータ)を渡す場面がよくあります。

本記事では、Pythonスクリプトへ引数を渡すための代表的な3つの方法、「sys.argv」「getopt」「argparse」について、サンプルコードと実行結果付きでわかりやすく解説します。

1. sys.argvを使う方法

Pythonの標準ライブラリであるsysモジュールに含まれるsys.argvは、スクリプトと一緒に渡された引数を取得できる最もシンプルな方法です。

  • sys.argv[0]:実行されたスクリプトのファイル名(デフォルト)
  • sys.argv[1]以降:渡された引数が順番に格納される

以下の例では、スクリプトが受け取った引数をどのように利用するかを示しています。

import sys
print(sys.argv[0])
print("Hello ",sys.argv[1],", welcome!")

上記のコードを実行するには、ターミナルウィンドウを開いて次のコマンドを入力します。ここではスクリプト名をargs_demo.pyとし、値「Samantha」を引数として渡します。

D:\Pythons\py3projects>python3 args_demo.py Samantha
args_demo.py
Hello Samantha welcome!

このように、sys.argv[0]にはファイル名が、sys.argv[1]には渡した引数が自動的に格納されていることが確認できます。

2. getoptを使う方法

getoptモジュールは、前述のsys.argvよりも柔軟な引数処理を可能にします。「-x 10」のようなオプション形式の引数を扱え、エラー処理や例外処理も組み込めます。もちろん、引数リストの取得にはsysモジュールも併用します。

以下のプログラムでは、引数として渡された2つの数値を受け取り、その積を計算します。先頭の引数(ファイル名)はスキップしている点に注目してください。

コード例

import getopt
import sys

# 先頭の引数(ファイル名)を除外する
all_args = sys.argv[1:]
prod = 1

try:
    # 引数を収集する
    opts, arg = getopt.getopt(all_args, 'x:y:')
    # オプションはちょうど2つである必要がある
    if len(opts) != 2:
        print ('usage: args_demo.py -x <first_value> -b <second_value>')
    else:
        # オプションと値を順に処理する
        for opt, arg_val in opts:
            prod *= int(arg_val)
        print('Product of the two numbers is {}'.format(prod))

except getopt.GetoptError:
    print ('usage: args_demo.py -a <first_value> -b <second_value>')
    sys.exit(2)

実行結果

上記のコードを実行すると、以下のような結果が得られます。

D:\Pythons\py3projects >python3 args_demo.py -x 3 -y 12
Product of the two numbers is 36
# 次の実行(引数なしの場合)
D:\Pythons\py3projects >python3 args_demo.py
usage: args_demo.py -x <first_value> -b <second_value>

正しくオプション付きで実行した場合は計算結果が表示され、引数が不正な場合にはGetoptError例外を捕捉して使用方法(usage)を表示するようになっています。

3. argparseを使う方法(推奨)

argparseモジュールは、Pythonで引数処理を行う際に最も推奨される標準的な方法です。最大の特徴は、エラーや例外の処理をモジュール側が自動的に行ってくれる点です。開発者は追加のコードを書くことなく、堅牢な引数処理を実現できます。

各引数に対して名前やヘルプテキスト(説明文)を指定しておけば、コードの他の部分ではその引数名を使って値にアクセスできます。また、「-h」オプションによるヘルプ表示も自動的に生成されます。

コード例

import argparse

# 引数パーサーを構築する
all_args = argparse.ArgumentParser()

# パーサーに引数を追加する
all_args.add_argument("-x", "--Value1", required=True,
    help="first Value")
all_args.add_argument("-y", "--Value2", required=True,
    help="second Value")
args = vars(all_args.parse_args())

# 積を求める
print("Product is {}".format(int(args['Value1']) * int(args['Value2'])))

実行結果

上記のコードを実行すると、以下のような結果が得られます。

D:\Pythons\py3projects>python3 args_demo.py -x 3 -y 21
Product is 63
# 次の実行(引数が不足している場合)
D:\Pythons\py3projects>python3 args_demo.py -x 3 -y
usage: args_demo.py [-h] -x VALUE1 -y VALUE2
args_demo.py: error: argument -y/--Value2: expected one argument

このように、必須引数(required=True)が不足している場合、argparseが自動的にエラーメッセージと使用方法を出力してくれるため、開発者は引数の検証ロジックを自分で書く必要がありません。

まとめ:どの方法を選ぶべきか?

方法特徴おすすめの用途
sys.argvシンプルで手軽。検証やヘルプ機能は自作が必要小規模スクリプト、簡単な個人ツール
getoptUNIX風のオプション形式に対応。C言語のgetoptに類似オプション形式の引数が必要な中規模スクリプト
argparseエラー処理・ヘルプ生成を自動化。機能が最も豊富本格的なCLIツール、チーム開発向け(推奨)

簡単な動作確認であればsys.argvで十分ですが、実用的なコマンドラインツールを作るなら、エラー処理とヘルプ表示が自動化されるargparseを採用するのがベストプラクティスです。

  1. PythonでXMLを解析・編集・生成する方法|ElementTree APIの使い方を徹底解説

    Pythonの標準ライブラリに含まれるXMLパーサーは、XMLファイルから必要な情報を読み取り、抽出するための最も手軽な手段のひとつです。このチュートリアルでは、xml.etree.ElementTree(ElementTree XML API)を使って、XMLファイルの「解析」「編集」「新規作成」を行う方法を、実際のコード例とともにわかりやすく解説します。 ElementTreeは、XMLデータの抽出・解析・変換をシンプルに実現できるAPIであり、外部ライブラリをインストールすることなくすぐに使い始められるのが大きな魅力です。 それでは、さっそくElementTreeを使ったPythonのX

  2. Pythonで関数を引数として渡す方法をわかりやすく解説

    Pythonでは、関数もオブジェクトの一つとして扱われるため、他の関数の引数として渡すことができます。この仕組みを活用すると、柔軟で再利用性の高いコードを書くことができます。map()関数を使った例Pythonが標準で提供している代表的な例が、第一引数に関数を受け取る map() 関数です。map(function, iterable, ...) — iterable(イテラブル)の各要素に対してfunctionを適用し、その結果を返します。もちろん、独自に定義したカスタム関数でも、引数として関数を受け取るように実装できます。自作関数sqr(x)を引数として渡すここでは、リストの各要素を2乗す