Pythonのコマンドライン引数の使い方

252, 2021-05-18

目次

Pythonのコマンドライン引数の使い方

Pythonではスクリプトに渡されたコマンドライン引数を参照することができます。
コマンドライン引数を参照するとプログラムの引数を扱うことができるようになります。

Pythonではコマンドライン引数を参照するにはsys.argvを使います。
結論から言うと↓のように使います。

import sys


print(sys.argv)
# ['intro.py', 'abc', 'def']

今回は具体的には↓を見ていきます。

  • コマンドライン引数とは?

  • sys.argvの使い方

  • argparseで引数解析

コマンドライン引数とは?

そもそもコマンドライン引数とはなんなのか? というところです。
「コマンドライン」とは端末に打ち込むコマンドの行のことです。
たとえば↓のようなものです。

$ myprog arg1 arg2

↑の場合、myprogはプログラムでコマンドです。
そして後続のarg1arg2はコマンドの引数です。
このコマンドが書かれた行のことをコマンドラインと言います。

「コマンドライン引数」とはこのコマンドラインの内のコマンドの引数のことを言います。
↑の例で言うとarg1arg2などがそうです。これがコマンドライン引数です。

コマンドライン引数はコマンドの振る舞いを変更するために指定されます。
それはファイル名だったりオプションだったりします。
コマンド(プログラム)は引数によってその振る舞いを変え、より具体的な処理を行います。
このようにすることでコマンドを限定的に使ったり、特定のニーズにあわせた使い方をできるようになります。

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.pymy-command.pysys.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なプログラムを作る場合、コマンドライン引数は必須と言ってもいいかもしれません。

引数はプログラムを豊かにする

引数爆発だ!

やめて!