コマンドライン引数を使用して Python スクリプトを実行したいですか? Python の sys、getopt、argparse モジュールを使用してコマンドライン引数を解析する方法を学びます。
Python では、ユーザー入力を読み込む場合は、
input()
関数を使用します。ただし、アプリケーションによっては、コマンド ラインでスクリプトを実行するときに特定の引数を渡したい場合があります。
このチュートリアルでは、コマンド ラインでオプションと引数を指定して Python スクリプトを実行する方法を学びます。次に、Python の組み込みモジュールを使用してそのようなオプションや引数を解析する方法を学びます。
さぁ、始めよう!

Python の sys.argv を理解する
C でプログラミングしたことがある場合は、プログラムに引数を渡す最も簡単な方法の 1 つがコマンド ラインを使用することであることをご存知でしょう。そのためには、main 関数を次のように構成できます。
#include<stdio.h>
int main(int argc, char **argv){
//argc: argument count
//argv: argument vector
//do something on the args
return 0;
}
ここで、
argc
引数カウントを表し、
argv
引数ベクトルを表します。
コマンドライン引数を使用した Python スクリプトの実行
Python では、
python3 filename.py
を使用してコマンド ラインで Python スクリプトを実行できます。その際、任意の数のコマンドライン引数を渡すこともできます。
$ python3 filename.py arg1 arg2 ... argn
sys モジュールは、これらのコマンドライン引数にアクセスして処理するためのすぐに使えるサポートを提供します。
sys.argv
Python スクリプトを実行するときに渡すすべてのコマンドライン引数のリストです。
コマンドライン引数を指定して main.py を実行する例を次に示します。
$ python3 main.py hello world python script
単純な for ループと列挙関数を使用して引数ベクトルをループできます。
# main.py
import sys
for idx, arg in enumerate(sys.argv):
print(f"arg{idx}: {arg}")
# Output
arg0:main.py
arg1:hello
arg2:world
arg3:python
arg4:script
最初の引数 (インデックス 0) が Python ファイルの名前であることがわかります。そして後続の引数はインデックス 1 から始まります。
これは、コマンドライン引数を受け入れて処理する最小限の動作プログラムです。ただし、次のような問題もあります。
- プログラムのユーザーはどの引数を渡すべきかをどうやって知るのでしょうか?
- そして、これらの議論は何を表しているのでしょうか?
これはあまり明確ではありません。これに対処するには、getopt モジュールまたは argparse モジュールを使用できます。それについては次のセクションで学びます。✅

Python の getopt を使用したコマンドライン引数の解析

組み込みの getopt モジュールを使用してコマンドライン引数を解析する方法を学びましょう。
getopt
モジュールから
getopt
をインポートした後、解析する引数と、スクリプトを実行するための短いオプションと長いオプションを指定できます。
sys.argv
のインデックス 1 から始まるすべての引数を解析する必要があります。したがって、解析するスライスは
sys.argv[1:]
です。
ここでは、
message
文字列と
file
名が必要になります。
m
と
f
短いオプションとして使用し、
message
と
file
長いオプションとして使用しましょう。
しかし、特定のオプションに引数が必要であることを確認するにはどうすればよいでしょうか?
- 短いオプションでは、短いオプション名の後にコロン (:) を追加することで、オプションに引数を要求することができます。
- 同様に、長いオプションの場合は、長いオプションの後に = 記号を追加できます。これらのオプションとそれぞれの引数をキャプチャできます。
これらを追加すると、main.py に次のコードが含まれます。
# main.py
import sys
from getopt import getopt
opts, args = getopt(sys.argv[1:],'m:f:',['message=','file='])
print(opts)
print(args)
ここで、変数
opts
には、オプションと引数がタプルのリストとして含まれています。渡す他の位置引数は
args
変数に収集されます。
スクリプトを実行するためにメッセージとファイル名を渡すことができ、短いオプションまたは長いオプションのいずれかを使用できます。
長いオプションを使用して main.py を実行すると、次のようになります。
$ python3 main.py --message hello --file somefile.txt
opts
変数には、オプションと引数がタプルとして含まれています。位置引数を渡していないため、
args
空のリストです。
# Output
[('--message', 'hello'), ('--file', 'somefile.txt')]
[]
同様に、次のような短いオプションも使用できます。
$ python3 main.py -m hello -f somefile.txt
# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
[]
⚠️ この例の
-m
short オプションは、Python スクリプトの実行時にモジュールをメイン モジュールとして実行するために使用されるコマンドライン フラグ-m
と混同しないでください。たとえば、main.py の実行時に
python3 -m unittest main.py
使用してメイン モジュールとして Unittest を実行します。
渡す他のすべての位置引数は
args
変数に収集されると述べました。以下に例を示します。
$ python3 main.py -m hello -f somefile.txt another_argument
args
リストには、位置引数 another_argument が含まれています。
# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
['another_argument']
ここで、
opts
タプルのリストです。したがって、それをループしてタプルを解凍し、特定のオプションに対応する引数を取り出すことができます。
しかし、これらの引数を処理した後、ファイル名とメッセージをどうすればよいでしょうか?ファイルを書き込みモードで開き、大文字に変換されたメッセージ文字列をファイルに書き込みます。
# main.py
import sys
from getopt import getopt
opts, args = getopt(sys.argv[1:],'m:f:',['message=','file='])
print(opts)
print(args)
for option, argument in opts:
if option == '-m':
message = argument
if option == '-f':
file = argument
with open(file,'w') as f:
f.write(message.upper())
短いオプションとコマンドライン引数を指定して main.py を実行してみましょう。
$ python main.py -m hello -f thisfile.txt
[('-m', 'hello'), ('-f', 'thisfile.txt')]
[]
main.py を実行すると、作業ディレクトリに「thisfile.txt」が表示されます。これには、大文字 (‘HELLO’) に変換された文字列「hello」が含まれています。
$ ls
main.py thisfile.txt
$ cat thisfile.txt
HELLO

Argparse を使用してコマンドライン引数を解析する方法
argparse モジュールも Python 標準ライブラリに組み込まれており、コマンド ライン引数を解析し、コマンド ライン インターフェイスを構築する機能を提供します。
コマンドライン引数を解析するには、argparse モジュールから
ArgumentParser
クラスをインポートしましょう。ここでは、
ArgumentParser
オブジェクトである
arg_parser
インスタンス化しました。
from argparse import ArgumentParser
arg_parser = ArgumentParser()
次に、2 つのコマンドライン引数を追加します。
- message : メッセージ文字列、および
- file : 操作したいファイルの名前。
ここで、
arg_parser
の
add_argument()
メソッドを呼び出して、これらの引数を両方追加します。
add_argument()
メソッド呼び出しでは、
help
文字列 (引数の説明) に設定できます。
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')
ここまでで、
arg_parser
インスタンス化し、コマンドライン引数を追加しました。プログラムがコマンド ラインで実行される場合、
arg_parser
の
parse_args()
メソッドを使用して引数の値を取得できます。
ここでは、引数の名前空間を変数
args
にキャプチャします。したがって、
args.argument_name
を使用して引数の値を取得できます。
引数の値を取得した後、大文字と小文字を入れ替えた
message
文字列を (
swapcase()
文字列メソッドを使用して)
file
に書き込みます。
args = arg_parser.parse_args()
message = args.message
file = args.file
with open(file,'w') as f:
f.write(message.swapcase())
すべてをまとめると、main.py ファイルは次のようになります。
# main.py
from argparse import ArgumentParser
arg_parser = ArgumentParser()
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')
args = arg_parser.parse_args()
print(args)
message = args.message
file = args.file
with open(file,'w') as f:
f.write(message.swapcase())
コマンドライン引数の使用法を理解する
main.py の実行時の引数の使用法を理解するには、次のように
--help
long オプションを使用できます。
$ python3 main.py --help
usage: main.py [-h] message file
positional arguments:
message message string
file filename
optional arguments:
-h, --help show this help message and exit
オプションの引数は
なく
、
message
と
file
の両方が
必須の
位置引数です。あるいは、短いオプション
-h
を使用することもできます。
$ python3 main.py -h
usage: main.py [-h] message file
positional arguments:
message message string
file filename
optional arguments:
-h, --help show this help message and exit
ご覧のとおり、両方の引数はデフォルトで位置引数です。したがって、これらの引数の 1 つ以上を渡さないと、エラーが発生します。
ここでは、
message
文字列の位置引数 (Hello) を渡していますが、
file
引数には値を指定していません。
そして、
file
引数が必要であることを示すエラーが表示されます。
$ python3 main.py Hello
usage: main.py [-h] message file
main.py: error: the following arguments are required: file
両方の位置引数を指定して main.py を実行すると、名前空間
args
に引数の値が含まれていることがわかります。
$ python3 main.py Hello file1.txt
# Output
Namespace(file='file1.txt', message='Hello')
現在の作業ディレクトリの内容を調べると、スクリプトによってファイル ‘file1.txt’ が作成されていることがわかります。
$ ls
file1.txt main.py
元のメッセージ文字列は「Hello」です。大文字と小文字を入れ替えると、ファイル「file1.txt」内のメッセージ文字列は「hELLO」になります。
$ cat file1.txt
hELLO
コマンドライン引数をオプションにする方法
これらのコマンドライン引数を
オプションに
するには、引数名の前に
--
を付けることができます。
main.py を変更して、
message
と
file
引数の両方をオプションにしましょう。
# main.py
from argparse import ArgumentParser
arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')
コマンドライン引数はどちらもオプションであるため、これらの引数にデフォルト値を設定できます。
if args.message and args.file:
message = args.message
file = args.file
else:
message = 'Python3'
file = 'myfile.txt'
この時点で、main.py ファイルには次のコードが含まれています。
# main.py
from argparse import ArgumentParser
arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')
args = arg_parser.parse_args()
print(args)
if args.message and args.file:
message = args.message
file = args.file
else:
message = 'Python3'
file = 'myfile.txt'
with open(file,'w') as f:
f.write(message.swapcase())
使用法を確認すると、
message
と
file are
ことがわかります。つまり、これらの引数の両方
なしで
main.py を実行できるようになりました。
$ python3 main.py --help
usage: main.py [-h] [--message MESSAGE] [--file FILE]
optional arguments:
-h, --help show this help message and exit
--message MESSAGE message string
--file FILE filename
$ python3 main.py
引数の名前空間では、
file
と
message
両方とも
None
です。
# Output
Namespace(file=None, message=None)
デフォルトの
file
名と
message
「myfile.txt」および「Python3」が使用されていることがわかります。ファイル「myfile.txt」は作業ディレクトリにあります。
$ ls
file1.txt main.py myfile.txt
そして、大文字と小文字を入れ替えた文字列「Python3」が含まれています。
$ cat myfile.txt
pYTHON3
--message
と
--file
引数の両方を使用して、コマンドを読みやすくすることもできます。
$ python3 main.py --message Coding --file file2.txt
# Output
Namespace(file='file2.txt', message='Coding')
作業ディレクトリに「file2.txt」が表示されます。
$ ls
file1.txt file2.txt main.py myfile.txt
そして、予想どおり、文字列「cODING」が含まれています。
$ cat file2.txt
cODING
結論
このチュートリアルで学んだことの概要は次のとおりです。
-
C プログラミング言語と同様に、Python では、引数ベクトル
sys.argv
をループすることでコマンド ライン引数にアクセスできます。sys.argv[0]
は Python スクリプトの名前です。したがって、引数sys.argv[1:]
を解析することに興味があります。 - ただし、可読性を高め、オプションを追加できるようにするために、 getopt および argparse モジュールを使用できます。
- getopt モジュールを使用すると、インデックス 1 からリストの末尾までのコマンド ライン引数のリストを解析できます。短いオプションと長いオプションの両方を指定できます。
- オプションが引数を取る場合、短いオプションと長いオプションの後にそれぞれコロン (:) と = を指定できます。
-
Python の argparse モジュールを使用すると、
ArgumentParser
オブジェクトをインスタンス化し、add_argument()
メソッドを使用して必要な位置引数を追加できます。オプションにするには、引数名の前に--
使用します。 -
コマンドライン引数の値を取得するには、
ArgumentParser
オブジェクトのparse_args()
メソッドを呼び出します。
次に、Python で安全なハッシュを実行する方法を学びます。
