【Python】sys.argvとは:スクリプトのパスやコマンドライン引数の取得
2023.02.20 /
本記事ではPythonにおける、sys.argvについて解説していきます。
Pythonの書籍やインターネット上でsys.argvを使っているプログラムをよく見ることがあると思います。
sys.argvはPythonのプログラムでよく利用される便利な変数です。sys.argvはリストであり、スクリプト名やコマンドライン引数が格納されています。
本記事を通して、sys.argvに格納されている各要素について理解を深めてください。
sysモジュールとは
sysモジュールはインタプリタで管理する変数や動作に関する情報を扱っているモジュールです。
sysモジュールはPythonの標準ライブラリなので、pipでインストールする必要はなく、Pythonが利用できる環境であれば最初から使うことができます。
sysモジュールを利用するにはスクリプトの先頭でimportします。
import sys
本記事ではsys.argvの使い方を詳しく解説していきますが、その他にもsys.versionやsys.platform、sys.exit()関数があります。
sys.versionには利用しているPythonのバージョンが格納されています。
>>> import sys
>>> sys.version
'3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]'
sys.platformにはスクリプトを実行したOSの情報が格納されます。
>>> import sys
>>> sys.platform
'win32'
sys.exit()関数は実行するとSystemExitの例外を発生します。プログラムを終了させたい場合に実行します。
sys.argvとは
sys.argvは実行したプログラムのファイル名やコマンドライン引数を含んだリストです。
Pythonのリストとは複数の値をまとめるデータ型です。リストについて詳しくは以下記事をご参照ください。
【Python】リスト(list)とは:基本から応用まで使い方をまとめて紹介
sys.argvの各要素に異なる値が格納されています。各要素に格納されている値について次項より解説していきます。
sys.argvの各要素の型は「文字列(str)」です。数値が必要な場合は、int()やfloat()を使って型変換をする必要があります
sys.argv[0]:ファイルのパス
sys.argvのインデックス番号0(sys.argv[0])にはプログラムのファイル名を含んだ文字列が格納されます。
私が使っているWindowsではファイル名を含むフルパスが返されます。例えば次のファイルを実行してみます。
# C:\test\argv.py
import sys
print(sys.argv[0])
>>> python argv.py
C:\test\argv.py
上記のようにプログラムのファイル名を含んだフルパスが返されます。
sys.argv[1]以降:コマンドライン引数
sys.argvの2番目の要素移行(sys.argv[1]以降)には、コマンドライン引数が格納されます。
コマンドライン引数とは、コマンドラインで指定した引数のことです。主に実行するプログラム名のあとに指定した文字列です
以下にsys.argvでコマンドライン引数を取得するプログラム例を記します。
# argv.py
import sys
print(sys.argv[1])
print(sys.argv[2])
>>> python argv.py office 54
office
54
sys.argvでコマンドライン引数を扱う場合の注意事項として、プログラムで使用するコマンドライン引数の個数と実際にコマンドラインで指定した引数の個数が異なるとエラー(IndexError: list index out of range)が発生します。
例えば上記のargv.pyを「python argv.py office」で実行するとIndexErrorが発生します。
sys.argvの使用用途
実行ファイル(exe)のフルパスを取得する
私はPythonで作成したプログラムは、pyinstallerを使って実行ファイル(exe)に変換し、社内のスタッフに渡しています。
【Python】pyinstallerでpyファイルを配布用にEXE化する方法
そのプログラムでは、しばしばファイルのパスを取得し、他の処理で利用することがあります。例えばpopplerやtesseract OCRで利用するファイル等を同じ階層に置いておき、環境変数を一時的に付与する際に利用したりします。
以下のプログラムでは、実行したファイルが格納されているフォルダへのパスを変数dirに格納しています。
import sys
from pathlib import Path
dir = Path(sys.argv[0]).parent.absolute()
上記ではpathlib.Path()でPathオブジェクトを生成し、parentで親フォルダを返します。その親フォルダに対してabsolute()を実行することで、親フォルダの絶対パスを返しています。
コンテキストメニューから渡されたファイルのパスを取得する
Windowsにはコンテキストメニューという、エクスプローラーやデスクトップにあるファイル・フォルダを右クリックして表示されるメニューがあります。
このコンテキストメニューにPythonの実行ファイルを追加することで、ファイルを直接指定したアプリに渡す(開く)ことができるようになります。
コンテキストメニューにアプリを追加する方法は以下記事をご参照ください。
【Windows10】エクスプローラー:右クリックで表示されるメニューにアプリを追加する
コンテキストメニューから渡されたファイルのパスはsys.argv[1]で取得できます。つまりコンテキストメニューからアプリを実行することは、コマンドライン引数にファイル名を指定するのと同意ということです。
コンテキストメニューを利用したアプリケーションとして、PDFをOCRするアプリケーションを作成して利用しています
まとめ
本記事「【Python】sys.argvとは:スクリプトのパスやコマンドライン引数の取得」はいかがでしたか。
sys.argvは様々なアプリケーションに応用が利きます。sys.argvを使って便利なアプリの作成してください。