Pythonのコマンドライン引数の使い方
- 作成日: 2021-05-18
- 更新日: 2023-12-26
- カテゴリ: Python
Pythonのコマンドライン引数の使い方
Pythonではスクリプトに渡されたコマンドライン引数を参照することができます。
コマンドライン引数を参照するとプログラムの引数を扱うことができるようになります。
Pythonではコマンドライン引数を参照するにはsys.argv
を使います。
結論から言うと↓のように使います。
import sys
print(sys.argv)
# ['intro.py', 'abc', 'def']
今回は具体的には↓を見ていきます。
- コマンドライン引数とは?
- sys.argvの使い方
- argparseで引数解析
コマンドライン引数とは?
そもそもコマンドライン引数とはなんなのか? というところです。
「コマンドライン」とは端末に打ち込むコマンドの行のことです。
たとえば↓のようなものです。
$ myprog arg1 arg2
↑の場合、myprog
はプログラムでコマンドです。
そして後続のarg1
とarg2
はコマンドの引数です。
このコマンドが書かれた行のことをコマンドラインと言います。
「コマンドライン引数」とはこのコマンドラインの内のコマンドの引数のことを言います。
↑の例で言うとarg1
やarg2
などがそうです。これがコマンドライン引数です。
コマンドライン引数はコマンドの振る舞いを変更するために指定されます。
それはファイル名だったりオプションだったりします。
コマンド(プログラム)は引数によってその振る舞いを変え、より具体的な処理を行います。
このようにすることでコマンドを限定的に使ったり、特定のニーズにあわせた使い方をできるようになります。
sys.argvの使い方
Pythonでコマンドライン引数を参照するにはsys
モジュールのargv
属性を参照します。
sys
モジュールは↓のようにインポートします。
import sys
sys.argv
はリストです。
このリストにはコマンド名を含めたコマンドライン引数が格納されています。
print(type(sys.argv))
# <class 'list'>
コマンドライン引数を特に指定しない場合はリストの中身はコマンド名だけになります。
print(sys.argv)
# ['argv.py']
↑の場合、実行しているコマンドは↓のようなものです。
$ python argv.py
↑の場合は「python
がコマンド名になるんじゃないの?」というところですが、↑のようにPythonでスクリプトを実行する場合は、sys.argv
の中身はスクリプト(argv.py
)の引数になります。
つまり、↑の場合だとargv.py
からがsys.argv
に保存されます。
argv.py
というコマンド名が紛らわしい場合は↓のようにコマンド名を変更してみてください。
$ python command.py
$ python my-command.py
↑の場合、command.py
やmy-command.py
がsys.argv
に格納されます。
コマンド名がスクリプトのフルパスになるかどうかはOSにより異なります。
引数を指定した場合のsys.argv
引数を指定した場合のsys.argv
の中身を見てみます。
例えば↓のようなコマンドを実行します。
$ python argv.py arg1 arg2
↑のコマンドを実行した場合、↓のコードの出力は↓のようになります。
print(sys.argv)
# ['argv.py', 'arg1', 'arg2']
また、↓のようにオプションを指定した場合を見てみます。
$ python argv.py --opt1 arg1
sys.argv
にはプレインな引数が保存されます。
この時にコマンドライン引数のオプションの解析は実行されません。
そのため↓のような結果になります。
print(sys.argv)
# ['argv.py', '--opt1', 'arg2']
sys.argvをfor文で回す
sys.argv
はただのリストです。
そのため↓のようにfor
文で回せば引数の一覧を出力できます。
for arg in sys.argv[1:]:
print(arg)
# arg1
# arg2
for
文で回す時のコツとしては、sys.argv[1:]
のようにスライスでargv
の先頭の要素を飛ばすのがよく行われます。
こうすることで引数のみを取り出すことができます。
-cを指定した場合のsys.argv
python
インタプリタにオプション-c
を指定すると、後続の文字列をスクリプトとして実行することができます。
例えば↓のコマンドはBashでは「Hello, World!」と出力されます。
$ python -c 'print("Hello, World!")'
Hello, World!
この-c
オプションを指定している状態でsys.argv
を参照すると、argv
の最初の要素は-c
になります。
これは↓のコマンドで確認することができます。
$ python -c 'import sys; print(sys.argv)'
['-c']
pythonインタプリタのみの場合
python
インタプリタのみを単独で起動し、対話モードでコードを入力する場合、sys.argv
の最初の要素は空文字列になります。
$ python
Python 3.8.1 (default, Apr 17 2020, 22:37:05)
[GCC 10.0.0 20191202 (experimental)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.argv)
['']
>>>
argparseで引数解析
コマンドライン引数の解析には標準ライブラリのargparse
がよく使われます。
argparse
はオプションの解析を半自動で行ってくれる便利ライブラリです。
argparse
の使い方については↓を参照してみてください。
おわりに
今回はPythonのコマンドライン引数について見てみました。
CLIなプログラムを作る場合、コマンドライン引数は必須と言ってもいいかもしれません。
🦝 < 引数はプログラムを豊かにする
🐭 < 引数爆発だ!
🦊 < やめて!