Python

【Python】コード実行時に値を引き渡す方法【コマンドライン引数】

この記事では、Pythonのコマンドライン引数について解説します。

コマンドライン引数とは、プログラム実行時に引き渡される値です。以下のようにPythonプログラムを実行した場合、「value1」と「value2」がコマンドライン引数です。

$ python main.py value1 value2

コマンドライン引数を使うことでプログラム実行時のオプションなどを指定できます。

それでは、コマンドライン引数の使い方を見ていきましょう!

sys.argvでコマンドライン引数を参照する

コマンドライン引数は、sysモジュールのargvリストから参照することができます。sysモジュールは、標準ライブラリなのでインポートするだけで使用可能です。

import sys

sys.argv

sys.argvには、以下のように値が格納されています。

argv[0] スクリプト名。フルパス名かどうかはOSによって異なる。
argv[1]以降 コマンドライン引数

サンプル

実際にコマンドライン引数を受け取ってみましょう!

main.py

import sys

# 受け取ったコマンドライン引数をargs変数に代入
args = sys.argv

# スクリプト名
print(args[0])

# 第1引数
print(args[1])

# 第2引数
print(args[2])

では、このコードをターミナルから実行してみます。実行時に「aaa」と「bbb」という値を渡しています。

ターミナルやコマンドプロンプトから実行

$ python3 main.py aaa bbb
main.py
aaa
bbb

コマンドライン引数で受け取った値を出力することができました。

argparseでコマンドライン引数を参照する

argparseモジュールを使うことで少ないコードで強力にコマンドライン引数を取り扱うことができます。argparseモジュールは、Python 3.2で追加された標準ライブラリです。

argparseモジュールは、以下の手順で使用します。

  • STEP1
    argparseのインポート

    argparseモジュールを使用するために、まずはインポートします。

    import argparse​
  • STEP2
    パーサーの生成

    パーサーを生成します。

    # パーサー作成
    parser = argparse.ArgumentParser()

    ちなみにパーサーとは、なにかしらのルールに則って書かれた文字データを解析してプログラムで使えるように変換するプログラムのことを言います。

  • STEP3
    コマンドライン引数を追加する

    受け取るコマンドライン引数の情報を追加します。ここで設定された情報はコマンドライン引数を解析する際に使われます。

    # コマンドライン引数の追加
    parser.add_argument()
    実際に使用するには、引数が必要となる
  • STEP4
    コマンドライン引数を解析する

    ステップ3で渡された情報を元に、コマンドライン引数を解析します。

    # コマンドライン引数を解析
    parser.parse_args()

それでは、実際にコマンドライン引数を取得してみましょう!

main.py

import argparse

# パーサー
parser = argparse.ArgumentParser()

# コマンドライン引数追加('arg1'=名前, type=変換する型, help=簡潔な説明)
parser.add_argument('arg1', type=int, help='整数値')
# コマンドライン引数追加(typeは省略されるとstrとなる)
parser.add_argument('arg2', help='文字列')

# コマンドライン引数を解析
args = parser.parse_args()

# 出力
print(f'arg1 = {args.arg1}, 型: {type(args.arg1)}')
print(f'arg2 = {args.arg2}, 型: {type(args.arg2)}')

ターミナルで実行

$ python main.py 123 arg2
arg1 = 123, 型: <class 'int'>
arg2 = arg2, 型: <class 'str'>

ヘルプの表示

コマンドライン引数を解析するプログラムはコマンドラインにヘルプを表示することができます。ヘルプを表示するにはプログラム実行時に--help、または-hオプションを指定します。

試しに、先ほどのコードのヘルプを表示してみます。

コマンドラインで実行

$ python main.py -h
usage: main.py [-h] arg1 arg2

positional arguments:
  arg1        整数値
  arg2        文字列

optional arguments:
  -h, --help  show this help message and exit

オプショナル引数

add_argument()メソッドでコマンドライン引数の名前を指定する際に--名前と指定することでオプショナル引数を指定できます。

main.py

import argparse

# パーサー
parser = argparse.ArgumentParser()

# オプショナル引数
parser.add_argument('-a1', '--arg1', type=int)
parser.add_argument('-a2', '--arg2')

# コマンドライン引数を解析
args = parser.parse_args()

# 出力(--の方の名前を使う)
print(f'arg1 = {args.arg1}')
print(f'arg2 = {args.arg2}')
# 辞書として扱いたい場合
print(vars(args))

コマンドラインで実行

$ python main.py -a1 123 -a2 a2
arg1 = 123
arg2 = a2
{'arg1': 123, 'arg2': 'a2'}

getoptでコマンドライン引数を参照する

getoptモジュールは、C言語のgetopt()関数のように扱えるコマンドラインオプションのパーサです。C言語を使っている方のためのモジュールとなります。

あえてargparseではなくgetoptを使う必要もありませんが、既存のモジュールなんかではよく使われているので覚えておくと便利です。

getoptモジュールは、getopt.getopt()関数を使ってコマンドライン引数を解析します。

import getopt

getopt.getopt(args, shortopts, longopts=[])

args

args引数には、解析する引数のリストを渡します。
基本的に sys.argv[1:] が指定されます。

shortopts

認識させたいオプション文字を1つの文字列で指定します。値を受け取るオプション文字には、末尾に:を付けます。

例えば、-a, -b, -cのオプションが用意されており、-bで値を受け取る場合のshortoptsは以下のようになります。

'b:ac'

longopts

認識させたいオプションの名前を文字列で指定します。値を受け取るオプションには、名前の最後に=を付けます。

['aaa', 'bbb=', 'ccc']

返り値

返り値は、解析されたオプション文字と値のタプル(option, value)を格納したリストとオプションの後ろに記述されたコマンドライン引数のリストを持ったタプルが返されます。

([(option, value)...], [コマンドライン引数...])

では、簡単なサンプルコードを見てみましょう!

import getopt
import sys

args = sys.argv[1:]

opts, args = getopt.getopt(args, 'b:ac', 
                           ['aaa', 'bbb=', 'ccc'])
print(f'opts: {opts}')
print(f'args: {args}')

実行結果

% python3 main.py -a -b 123 -c arg1 arg2
opts: [('-a', ''), ('-b', '123'), ('-c', '')]
args: ['arg1', 'arg2']

実際には以下のような感じで使います。

import sys

def main(args=None):

    if args is None:
        args = sys.argv[1:]
    import getopt

    # 例外処理 
    try:
        opts, args = getopt.getopt(args, 'b:ac', 
                            ['aaa', 'bbb=', 'ccc'])
    except getopt.error as err:
        print(err)
        return 2

    # for文で処理
    for o, a in opts:
        if o in ("-a", "--aaa"):
            print(f'-a, --aaa: {a}')
        if o in ("-b", "--bbb"):
            print(f'-b, --bbb: {a}')
        if o in ("-c", "--ccc"):
            print(f'-c, --ccc: {a}')

    # 何かしらの処理を記述

    return None


if __name__ == "__main__":
    sys.exit(main())

実行結果

% python3 main.py -a -b 100 -c
-a, --aaa: 
-b, --bbb: 100
-c, --ccc:

まとめ

この記事では、Pythonのコマンドライン引数を使う方法を解説しました。

sys.argvを使えば簡単に取得でき、もっとしっかり使いたい場合は、argparseモジュールを使用することでかなり色々なことができます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ