【Python】コマンドライン引数を扱うargparseの使い方

この記事では、Pythonの標準ライブラリであるargparseを使って、コマンドライン引数を簡単に扱う方法を解説します。

基本的な使い方から高度なテクニックまで、具体的なサンプルコードとともにわかりやすく説明しますので、初心者の方でも安心して学べます。

これを読めば、あなたも自分のスクリプトに柔軟なコマンドライン引数を追加できるようになりますよ。

目次から探す

argparseとは

Pythonでスクリプトを作成する際、コマンドライン引数を扱うことがよくあります。

コマンドライン引数を使うことで、スクリプトの動作を柔軟に変更したり、ユーザーからの入力を受け取ることができます。

Pythonには、コマンドライン引数を簡単に扱うための標準ライブラリとしてargparseが用意されています。

argparseの概要

argparseは、Pythonの標準ライブラリの一つで、コマンドライン引数をパース(解析)するためのモジュールです。

argparseを使うことで、スクリプトに対して簡単に引数を追加し、それらの引数を解析して利用することができます。

例えば、以下のようなコマンドライン引数を持つスクリプトを考えてみましょう。

python script.py --input file.txt --output result.txt

このスクリプトでは、--input--outputという2つのオプション引数を受け取っています。

argparseを使うことで、これらの引数を簡単に定義し、解析することができます。

argparseの利点

argparseを使うことには、いくつかの利点があります。

  1. 使いやすさ: argparseは非常に使いやすく、少ないコードでコマンドライン引数を定義し、解析することができます。
  2. 自動的なヘルプメッセージの生成: argparseは、スクリプトに対して自動的にヘルプメッセージを生成します。

ユーザーが-h--helpオプションを指定すると、スクリプトの使い方を表示してくれます。

  1. デフォルト値の設定: 引数に対してデフォルト値を設定することができ、ユーザーが引数を指定しなかった場合でもスクリプトが正常に動作するようにできます。
  2. 型の指定: 引数の型を指定することができ、例えば整数や浮動小数点数、文字列など、特定の型の引数を受け取ることができます。
  3. エラーメッセージの自動生成: 引数の解析に失敗した場合、argparseは自動的に適切なエラーメッセージを生成し、ユーザーに表示します。

これらの利点により、argparseはPythonでコマンドライン引数を扱う際の強力なツールとなります。

次のセクションでは、argparseの基本的な使い方について詳しく見ていきましょう。

argparseの基本的な使い方

ここでは、argparseモジュールを使ってコマンドライン引数を扱う基本的な方法について解説します。

具体的には、argparseモジュールのインポートから引数の解析、取得、利用までの流れを見ていきます。

argparseモジュールのインポート

まずは、argparseモジュールをインポートする必要があります。

Pythonの標準ライブラリに含まれているため、追加のインストールは不要です。

import argparse

ArgumentParserオブジェクトの作成

次に、ArgumentParserオブジェクトを作成します。

このオブジェクトは、コマンドライン引数を解析するための中心的な役割を果たします。

parser = argparse.ArgumentParser(description="このスクリプトの説明")

descriptionパラメータには、スクリプトの簡単な説明を記述できます。

これは、ヘルプメッセージを表示する際に役立ちます。

引数の追加

引数を追加するには、add_argumentメソッドを使用します。

ここでは、必須引数とオプション引数の追加方法について説明します。

必須引数の追加

必須引数は、スクリプトを実行する際に必ず指定しなければならない引数です。

以下の例では、input_fileという必須引数を追加しています。

parser.add_argument('input_file', help='入力ファイルのパス')

オプション引数の追加

オプション引数は、指定しなくてもスクリプトが実行できる引数です。

以下の例では、-oまたは--outputというオプション引数を追加しています。

parser.add_argument('-o', '--output', help='出力ファイルのパス', default='output.txt')

defaultパラメータを指定することで、引数が指定されなかった場合のデフォルト値を設定できます。

引数の解析

引数を追加した後は、parse_argsメソッドを使用してコマンドライン引数を解析します。

このメソッドは、引数を解析し、結果をオブジェクトとして返します。

args = parser.parse_args()

引数の取得と利用

解析された引数は、argsオブジェクトの属性としてアクセスできます。

以下の例では、input_fileoutput引数を取得して利用しています。

input_file = args.input_file
output_file = args.output
print(f"入力ファイル: {input_file}")
print(f"出力ファイル: {output_file}")

これで、基本的なargparseの使い方について理解できたと思います。

次のセクションでは、引数の詳細設定についてさらに深掘りしていきます。

引数の詳細設定

argparseを使うことで、コマンドライン引数に対してさまざまな詳細設定を行うことができます。

ここでは、デフォルト値の設定、型の指定、ヘルプメッセージのカスタマイズ、必須引数とオプション引数の違いについて詳しく解説します。

デフォルト値の設定

引数にデフォルト値を設定することで、ユーザーがその引数を指定しなかった場合に自動的に使用される値を指定できます。

デフォルト値はdefaultパラメータを使って設定します。

import argparse
parser = argparse.ArgumentParser(description="デフォルト値の設定例")
parser.add_argument('--foo', default='bar', help='デフォルト値はbarです')
args = parser.parse_args()
print(f"fooの値: {args.foo}")

このスクリプトを引数なしで実行すると、fooの値はデフォルトのbarになります。

$ python script.py
fooの値: bar

引数を指定すると、その値が使用されます。

$ python script.py --foo baz
fooの値: baz

型の指定

引数の型を指定することで、コマンドライン引数が特定の型に変換されるように設定できます。

typeパラメータを使って型を指定します。

import argparse
parser = argparse.ArgumentParser(description="型の指定例")
parser.add_argument('--num', type=int, help='整数型の引数')
args = parser.parse_args()
print(f"numの値: {args.num}")

このスクリプトを実行すると、--num引数は整数型として扱われます。

$ python script.py --num 10
numの値: 10

もし整数以外の値を指定するとエラーになります。

$ python script.py --num abc
usage: script.py [-h] [--num NUM]
script.py: error: argument --num: invalid int value: 'abc'

ヘルプメッセージのカスタマイズ

argparseは自動的にヘルプメッセージを生成しますが、helpパラメータを使ってカスタマイズすることもできます。

import argparse
parser = argparse.ArgumentParser(description="ヘルプメッセージのカスタマイズ例")
parser.add_argument('--foo', help='foo引数の説明')
parser.add_argument('--bar', help='bar引数の説明')
args = parser.parse_args()

このスクリプトを-hまたは--helpオプションで実行すると、カスタマイズされたヘルプメッセージが表示されます。

$ python script.py -h
usage: script.py [-h] [--foo FOO] [--bar BAR]
ヘルプメッセージのカスタマイズ例
optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo引数の説明
  --bar BAR   bar引数の説明

必須引数とオプション引数の違い

argparseでは、引数を必須にするかオプションにするかを設定できます。

必須引数はユーザーが必ず指定しなければならない引数で、オプション引数は指定しなくても良い引数です。

必須引数の設定

必須引数はrequired=Trueを使って設定します。

import argparse
parser = argparse.ArgumentParser(description="必須引数の設定例")
parser.add_argument('--foo', required=True, help='必須引数')
args = parser.parse_args()
print(f"fooの値: {args.foo}")

このスクリプトを引数なしで実行するとエラーになります。

$ python script.py
usage: script.py [-h] --foo FOO
script.py: error: the following arguments are required: --foo

オプション引数の設定

オプション引数はデフォルトで必須ではありません。

requiredパラメータを指定しないか、required=Falseを設定します。

import argparse
parser = argparse.ArgumentParser(description="オプション引数の設定例")
parser.add_argument('--bar', help='オプション引数')
args = parser.parse_args()
print(f"barの値: {args.bar}")

このスクリプトを引数なしで実行してもエラーにはなりません。

$ python script.py
barの値: None

引数を指定すると、その値が使用されます。

$ python script.py --bar baz
barの値: baz

以上が、argparseを使った引数の詳細設定です。

これらの設定を活用することで、より柔軟で使いやすいコマンドラインインターフェースを作成することができます。

高度な使い方

argparseを使いこなすためには、基本的な使い方だけでなく、より高度な機能も理解しておくと便利です。

ここでは、サブコマンドの利用、相互排他グループの利用、カスタムアクションの作成について解説します。

サブコマンドの利用

サブコマンドは、コマンドラインツールに複数の機能を持たせる際に非常に便利です。

例えば、Gitのようなツールでは clonecommit などのサブコマンドがあります。

argparseを使ってサブコマンドを実装する方法を見てみましょう。

import argparse
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description='サブコマンドの例')
# サブコマンドの追加
subparsers = parser.add_subparsers(dest='command')
# サブコマンド 'foo' の設定
parser_foo = subparsers.add_parser('foo', help='fooのヘルプメッセージ')
parser_foo.add_argument('bar', type=int, help='barの説明')
# サブコマンド 'baz' の設定
parser_baz = subparsers.add_parser('baz', help='bazのヘルプメッセージ')
parser_baz.add_argument('--qux', type=str, help='quxの説明')
# 引数の解析
args = parser.parse_args()
# サブコマンドに応じた処理
if args.command == 'foo':
    print(f'fooコマンドが実行されました。bar: {args.bar}')
elif args.command == 'baz':
    print(f'bazコマンドが実行されました。qux: {args.qux}')

このスクリプトを実行すると、以下のようにサブコマンドを使って異なる動作をさせることができます。

$ python script.py foo 123
fooコマンドが実行されました。bar: 123
$ python script.py baz --qux hello
bazコマンドが実行されました。qux: hello

相互排他グループの利用

相互排他グループを使うと、複数のオプション引数の中から一つだけを選択させることができます。

例えば、--verbose--quietのように、どちらか一方しか指定できない場合に便利です。

import argparse
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description='相互排他グループの例')
# 相互排他グループの作成
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='詳細な出力')
group.add_argument('--quiet', action='store_true', help='静かな出力')
# 引数の解析
args = parser.parse_args()
# 引数に応じた処理
if args.verbose:
    print('詳細な出力が選択されました')
elif args.quiet:
    print('静かな出力が選択されました')
else:
    print('どちらも選択されていません')

このスクリプトを実行すると、以下のように相互排他グループの動作を確認できます。

$ python script.py --verbose
詳細な出力が選択されました
$ python script.py --quiet
静かな出力が選択されました
$ python script.py
どちらも選択されていません

カスタムアクションの作成

argparseでは、デフォルトのアクション以外にもカスタムアクションを作成することができます。

カスタムアクションを使うと、引数の解析時に特定の処理を実行することができます。

import argparse
# カスタムアクションの定義
class CustomAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print(f'カスタムアクションが実行されました: {values}')
        setattr(namespace, self.dest, values)
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description='カスタムアクションの例')
# カスタムアクションの追加
parser.add_argument('--custom', action=CustomAction, help='カスタムアクションの説明')
# 引数の解析
args = parser.parse_args()
# 引数の表示
print(f'custom: {args.custom}')

このスクリプトを実行すると、以下のようにカスタムアクションが実行されます。

$ python script.py --custom value
カスタムアクションが実行されました: value
custom: value

カスタムアクションを使うことで、引数の解析時に特定の処理を追加することができます。

これにより、より柔軟なコマンドラインツールを作成することが可能です。

以上がargparseの高度な使い方です。

これらの機能を活用することで、より強力で使いやすいコマンドラインツールを作成することができます。

実践例

ここでは、実際にargparseを使ったスクリプトの例をいくつか紹介します。

基本的な使い方から、複数の引数を持つスクリプト、さらにサブコマンドを持つスクリプトまで、段階的に解説していきます。

基本的なスクリプトの例

まずは、argparseを使った基本的なスクリプトの例を見てみましょう。

このスクリプトでは、ユーザーから名前を入力してもらい、その名前を表示します。

import argparse
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description="名前を入力して表示するスクリプト")
# 引数の追加
parser.add_argument('name', type=str, help='あなたの名前')
# 引数の解析
args = parser.parse_args()
# 引数の取得と利用
print(f"こんにちは、{args.name}さん!")

このスクリプトを実行する際には、以下のようにコマンドラインから名前を入力します。

$ python script.py Taro
こんにちは、Taroさん!

複数の引数を持つスクリプトの例

次に、複数の引数を持つスクリプトの例を見てみましょう。

このスクリプトでは、ユーザーから名前と年齢を入力してもらい、それを表示します。

import argparse
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description="名前と年齢を入力して表示するスクリプト")
# 引数の追加
parser.add_argument('name', type=str, help='あなたの名前')
parser.add_argument('age', type=int, help='あなたの年齢')
# 引数の解析
args = parser.parse_args()
# 引数の取得と利用
print(f"こんにちは、{args.name}さん!あなたは{args.age}歳ですね。")

このスクリプトを実行する際には、以下のようにコマンドラインから名前と年齢を入力します。

$ python script.py Taro 25
こんにちは、Taroさん!あなたは25歳ですね。

サブコマンドを持つスクリプトの例

最後に、サブコマンドを持つスクリプトの例を見てみましょう。

このスクリプトでは、ユーザーが greet または farewell というサブコマンドを選択し、それに応じたメッセージを表示します。

import argparse
# ArgumentParserオブジェクトの作成
parser = argparse.ArgumentParser(description="サブコマンドを持つスクリプト")
subparsers = parser.add_subparsers(dest='command')
# greetサブコマンドの追加
greet_parser = subparsers.add_parser('greet', help='挨拶を表示する')
greet_parser.add_argument('name', type=str, help='あなたの名前')
# farewellサブコマンドの追加
farewell_parser = subparsers.add_parser('farewell', help='別れの挨拶を表示する')
farewell_parser.add_argument('name', type=str, help='あなたの名前')
# 引数の解析
args = parser.parse_args()
# 引数の取得と利用
if args.command == 'greet':
    print(f"こんにちは、{args.name}さん!")
elif args.command == 'farewell':
    print(f"さようなら、{args.name}さん!")

このスクリプトを実行する際には、以下のようにコマンドラインからサブコマンドと名前を入力します。

$ python script.py greet Taro
こんにちは、Taroさん!
$ python script.py farewell Taro
さようなら、Taroさん!

これで、argparseを使った基本的なスクリプトから、複数の引数を持つスクリプト、さらにサブコマンドを持つスクリプトまでの実践例を紹介しました。

これらの例を参考にして、さまざまなコマンドライン引数を扱うスクリプトを作成してみてください。

トラブルシューティング

argparseを使ってコマンドライン引数を処理する際に、いくつかのよくあるエラーや問題に直面することがあります。

ここでは、そうした問題の対処法とデバッグのポイントについて解説します。

よくあるエラーとその対処法

エラー: 引数が不足している

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('input_file')
args = parser.parse_args()

上記のスクリプトを引数なしで実行すると、以下のようなエラーが発生します。

usage: script.py [-h] input_file
script.py: error: the following arguments are required: input_file

対処法: 必須引数が不足している場合、引数を正しく指定して実行する必要があります。

もしくは、引数をオプションに変更することも考えられます。

エラー: 無効な引数

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--count', type=int)
args = parser.parse_args()

上記のスクリプトを無効な引数で実行すると、以下のようなエラーが発生します。

usage: script.py [-h] [--count COUNT]
script.py: error: argument --count: invalid int value: 'abc'

対処法: 引数の型が正しくない場合、正しい型の引数を指定して実行する必要があります。

例えば、--countには整数値を指定します。

エラー: 相互排他引数の誤使用

import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_true')
args = parser.parse_args()

上記のスクリプトを--foo--barの両方を指定して実行すると、以下のようなエラーが発生します。

usage: script.py [-h] [--foo | --bar]
script.py: error: argument --bar: not allowed with argument --foo

対処法: 相互排他引数は同時に指定できないため、どちらか一方のみを指定して実行する必要があります。

デバッグのポイント

デバッグポイント1: 引数の確認

スクリプト内で引数が正しく解析されているか確認するために、print文を使って引数の内容を出力します。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--count', type=int)
args = parser.parse_args()
print(args)

デバッグポイント2: ヘルプメッセージの確認

ヘルプメッセージを確認することで、引数の設定が正しいかどうかを確認できます。

-hまたは--helpオプションを使ってヘルプメッセージを表示します。

python script.py --help

デバッグポイント3: デフォルト値の確認

デフォルト値が正しく設定されているか確認するために、引数を指定せずに実行してデフォルト値が適用されているか確認します。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--count', type=int, default=10)
args = parser.parse_args()
print(args.count)

デバッグポイント4: 型の確認

引数の型が正しく設定されているか確認するために、typeオプションを使って引数の型を指定し、正しい型の引数を渡して実行します。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--count', type=int)
args = parser.parse_args(['--count', '5'])
print(args.count)

以上のポイントを押さえておくことで、argparseを使ったコマンドライン引数の処理におけるトラブルシューティングがスムーズに行えます。

目次から探す