Pythonのコマンドライン引数でargparseやgetoptを使う方法

スポンサーリンク

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

Pythonのコマンドライン引数は、スクリプトを実行する際にプログラムに渡されるパラメータです。

コマンドライン引数は、プログラムへの特定の入力を提供するために使用されます。

スポンサーリンク

Pythonでコマンドライン引数を使うメリットとは?

Pythonのコマンドライン引数は、プログラムの汎用性を保つのに役立ちます

例えば、CSVファイルを処理するプログラムを書くとしましょう。

コマンドラインからCSVファイル名を渡せば、どんなCSVファイルに対してもプログラムが動作します

これによって、プログラムは疎結合になり、保守が容易になります。

コマンドライン引数のもう一つの利点は、セキュリティの強化もあります。

例えば、データベースにデータを保存するプログラムがあるとします。

もし、データベースの認証情報をスクリプトや何らかの設定ファイルに保存すれば、そのファイルにアクセスできる人なら誰でもアクセスして実行することができるようになります。

しかし、ユーザー/パスワードがコマンドラインの引数として提供されていれば、ファイルシステムには存在しないので、プログラムはより安全なものとなる。

Pythonでコマンドライン引数の渡し方

ターミナルからpythonスクリプトを実行する場合、スクリプト名の後に引数を渡すだけです。

引数は空白文字で区切られます。

$ python main.py arg1 arg2

Pythonスクリプトでコマンドライン引数を読み取る方法

Pythonスクリプトのコマンドライン引数を読み取り、解析するモジュールとして、3つのモジュールがよく知られています。

  1. sys.argv
  2. getopt
  3. argparse

sysモジュールを使ったPythonコマンドライン引数の読み込み

コマンドライン引数は,sysモジュールの変数 argvに格納されます.この変数は,文字列のリストとなっています。

このリストからコマンドライン引数を読み出して、プログラム内で使用することができます

スクリプト名も sys.argv 変数に格納されているコマンドライン引数の一部であることに注意してください。

import sys

if len(sys.argv) != 2:
    raise ValueError('Please provide email-id to send the email.')

print(f'Script Name is {sys.argv[0]}')
email = sys.argv[ 1 ]
print(f'Sending test email to {email}')
  1. getoptモジュールを使用したコマンドライン引数のパース

Pythonのgetoptモジュールは、Unixのgetopt()関数と似たような働きをします。

このモジュールは、Unixの多くのコマンドと同様に、スクリプトにオプションとその値を受け入れさせたい場合に役立ちます。

このモジュールは sys.argv と連動して、コマンドライン引数をパースし、オプションの値を多プルのリストとして抽出します。

import getopt
import sys

argv = sys.argv[ 1:]
opts, args = getopt.getopt(argv,'x:y:')

print(f'Options Tuple is {opts}')

print(f'Additional Command-line arguments list is {args}')

argparseモジュールを使ったコマンドライン引数のパース

Pythonのargparseモジュールもコマンドライン引数の解析に利用できます。

argparseモジュールには多くのオプションがあります。

  • 位置引数
  • ヘルプメッセージ
  • 引数のデフォルト値
  • 引数のデータ型を指定する、などなど。

以下はサンプルのコードです。

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("language")
parser.add_argument("name")

args =parser.parse_args()

if args.language == 'Python':
    print("I love Python too")
else:
    print("Learn Python, you will like it")

print(f'Hello {args.name}, this was a simple introduction to argparse module')
タイトルとURLをコピーしました