プログラムを書いていると、”この値を今だけ変えたい!”
といったことは良くありますよね。
そんな時に、実行コマンドに引数設定を行うと柔軟に対応できるようになります。
たとえば、テキストファイルを編集・出力するコードで、
「いつもはtext.txtで出力してるけど、今回はテスト用としてtext_test.txtで出力したい」
といった要望にも対応することができます。
このように、引数を設定することでプログラムの柔軟性が大きくアップするので、
ぜひともチェックしていきましょう!
プログラム処理で選択肢を増やす方法の1つです。
習得すると、無駄な処理の削減にもつながりますよ!
引数を使って無駄なコードを削減しよう!
なぜ引数を使うと良いのかという部分に、触れていきます。
プログラムファイルを自分で作ったり、他の人のものを見た時に、
”中身がほとんど同じプログラムファイルが何個もある”といった経験はないでしょうか?
たとえば、ファイルの入力・出力先の指定だけ違うなど。
それを放置してしまうと、修正が必要になった時に、
ほとんど同じプログラムも全て確認する必要が出てくるため、非常に管理に手間がかかります。
そういったファイルを生み出さないためにも、
一部だけ処理を変えたいときには、引数で処理の分岐を作る方法が有効になります。
似た内容のプログラムって、知らないと見落とされること多いですよね。私も見落とす自信があります!
引数を活用した例の紹介
引数を活用した例を3点ほど紹介します。
引数の値は、プログラムの実行開始時に渡すことができ、
処理全体にかかわる値を変更することが可能であるため、
できることの幅は非常に広いです。
【引数の活用例】
- ファイルやディレクトリの指定
処理の対象となるファイルやディレクトリのパスを引数にすることで、
さまざまな場所に適用できるようになる。
例:C:\Picture以下の.pngを削除 引数で指定したパス以下の.pngを削除
- 動作モードの切り替え
デバッグやリリース版などの動作モードを引数で指定することで、
コードを変更することなく、切り替えることが可能になる。
- 処理範囲の指定(時間・日時など)
処理の範囲を引数で制限することが可能となる。
例:開始時間と終了時間を引数にし、その範囲内のデータを集計
コードを変えずに挙動を変えられる。
うまく作れば、修正の手間を減らしてくれますね。
引数の使い方 ~sys・argparseモジュールの利用方法~
実際にどのように引数を指定できるか、見ていきましょう。
簡単に使えるsysモジュールとより便利に引数を扱えるargparseモジュールについて紹介します。
ここでは、テキストファイルを出力するプログラムの例で説明していきます。
以下は、引数無しのベースとなるコードです。
# メイン処理.
if __name__ == "__main__":
# ファイルを作成して、書き込む.
with open("sample.txt", "w") as file:
file.write("Hello!!!")
基本的な使い方:sysモジュール
さっそく、引数の処理を追加していきましょう。
sysモジュールをimportして、テキストファイルの名前と書きこむ文章を引数にしていきます。
【プログラム】
import sys
# メイン処理.
if __name__ == "__main__":
# 引数を受け取る.
file_name = sys.argv[1]
file_text = sys.argv[2]
# ファイルを作成して、書き込む例
with open(file_name, "w") as file:
file.write(file_text)
【実行方法】
引数1にファイル名、引数2に書き込む文章を指定。
sys_sample.txtを作成し、sample1と書き込みます。
python .\make_text.py 'sys_sample.txt' 'sample1'
引数を追加することで、
テキストファイル名や書き込む内容を自由に変えられるようになりましたね。
sysモジュールは少ないコードで簡単に引数を指定することができます。
一方で、引数の名前や変数型を指定することはできません。
より複雑な引数のルールを決めたいときは、
次に紹介するargparseモジュールを使用していきましょう!
手軽に使えますが、引数の個数が多いときは、
どれが何番目の引数だったかを確認する手間もありますね~
引数に変数名を付ける方法:argparseモジュール
基本的な使い方だと、引数の数が1~2個程度なら使いやすいですが、
それ以上だと引数の順番を気にしたりと扱いが不便ですよね。
そこでargparseモジュールによる引数に変数名を付ける方法を紹介します。
プログラムと使い方は以下の通りです。
【プログラム】
import argparse
# メイン処理.
if __name__ == "__main__":
# 引数の設定.
parser = argparse.ArgumentParser(description="ファイル名と内容の指定")
## --file_nameで指定した引数をfile_nameという変数名で受け取る.
parser.add_argument("--file_name", dest="file_name")
parser.add_argument("--file_text", dest="file_text")
args = parser.parse_args()
# # ファイルを作成して、書き込む例.
with open(args.file_name, "w") as file:
file.write(args.file_text)
【実行方法】
file_textに’sample2’、file_nameに’argparse_sample.txt’を指定。
argparse_sample.txtを作成して、sample2を書き込みます。
python make_text.py --file_text 'sample2' --file_name 'argparse_sample.txt'
引数の順番を気にせずに名前とともに指定ができてることがわかります。
このように、引数をより便利にしたいときはargparseを使用していきましょう!
argparseのほうが、コードの量は多くなるけど、
間違いは少なくできますね。
意図しない引数に対処しよう!
引数を指定するときに、よく間違えるのが以下の2点です。
- 引数の数を間違えた
- 引数の変数型を間違えた
指定を間違えると、プログラムも想定していない挙動になります。
そこで、argparseモジュールにより、意図しない引数を防ぐ方法を紹介していきます。
例として、以下のような対処が可能です。
import argparse
# メイン処理.
if __name__ == "__main__":
# 引数の設定.
parser = argparse.ArgumentParser(description="ファイル名と内容の指定")
# 必須の引数を設定
parser.add_argument(
"--file_name",
dest="file_name",
type=str, # 引数の変数型.
required=True, # 引数が必須か.
help="作成するファイルの名前を指定してください"
)
parser.add_argument(
"--file_text",
dest="file_text",
type=str, # 引数の変数型.
required=False, # 引数が必須か.
default="Hello!!!", # デフォルトのテキスト内容.
help="ファイルに書き込むテキストを指定してください"
)
# 引数を解析.
args = parser.parse_args()
# ファイルを作成して、書き込む.
try:
with open(args.file_name, "w") as file:
file.write(args.file_text)
print(f"ファイル '{args.file_name}' の作成が完了しました.")
except TypeError as e:
print(f"エラー: 引数の型が正しくありません: {e}")
except Exception as e:
print(f"エラーが発生しました: {e}")
追加したadd_argumentの設定は下記の3点です。
type
引数の変数型を設定できる。
引数の型が違えば、エラーを出力。required
引数が必須ならTrue, 必須でないならFalse。
デフォルトはFalse。
Trueで引数が無い場合は、エラーを表示。default
引数のデフォルト値を設定できる。
引数の指定が無ければ、この値を使用する。
【実行方法】
以下は、それぞれの機能を確認できるコマンドの例です。
# type: file_textがstr型ではないエラー.
python .\make_text.py --file_name note_sample.txt --file_text 555
# required: file_nameの引数が無い場合
python .\make_text.py --file_text "ssss"
# default: file_textの引数が無い場合
python .\make_text.py --file_name note_sample.txt
他にも、ディレクトリが引数ならos.path.isdirのチェックや
データファイルの取得・生成なら容量を考慮して上限となるファイル数を決めるのも良いでしょう。
引数を間違えると、被害が大きく、あとの修正が難しい場所にこそ、
しっかりとチェックを入れていきましょう。
コマンドの引数を間違えて、不要なファイルを大量生産。
PCの容量がなくなったこともありましたね…
まとめ
今回は、Pythonで実行コマンドに引数を設定する方法について解説しました。
変数の初期値をプログラムの外から決められるようなものなので、
動作のバリエーションは格段に増えますね。
プログラムの中で”他の値も試してみたいな”と思える場所があれば、
ぜひ導入を検討してみてください!
おわり