【Python】 コマンドライン引数の使い方(sys.argv)

Python ファイル操作

コマンドライン引数はターミナルコマンドライン上からプログラムを実行する際に設定する引数で、リストsys.argvに格納されます。コマンドライン引数を設定するにはいくつか方法がありますが、ここでは一番簡単なsys.argvを直接読み込んで使う方法についてまとめます。
# 2019/7/20 記事更新

確認した環境

  • Ubuntsu16.04LTS
  • Python3.7.3@Anaconda

コマンドライン引数とは

Pythonスクリプトをコマンドライン上で実行する場合、例えば以下のように入力します。

$ python3 sample.py 'hello'

スクリプト名(sample.py)の後に記述される引数(‘hello’)がコマンドライン引数です。
公式ドキュメントから書式を引用すると、以下のようになります。

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]	

一番最後の引数argsに記述されるsys.argvに引き渡されます。(その他の引数については公式ドキュメント参照)
リストsys.argvの構成は以下です。

argv[0] スクリプト名(上記例でいうと、”sample.py”)
argv[1:] コマンドライン引数(上記例でいうと、”hello”)

コマンドライン引数は、sys.argv[1:]に格納されるという点に注意です。

ちなみに第一引数の[-bBdEhiIOqsSuvVWx?]は、オプションを示しています。詳細は公式リファレンスを参照ください。

使い方

具体的な手順

コマンドライン引数をプログラム中で取得する手順を具体的に見ていきます。

  1. sysモジュールをインポートし、
  2. sys.argvに格納されている文字列を取得する
    • sys.argv[0]:  スクリプト名
    • sys.argv[1:] : コマンドライン引数

コードで表すと下記のようになります。

#---------------
#  argv.py
#---------------
import sys

# コマンドライン引数を変数argsに代入
args = sys.argv

print(args)

スクリプトをコマンドライン上で実行した結果を以下に示します。
sys.argv[0]にスクリプト名、sys.argv[1:]にコマンドライン引数が格納されていることがわかります。

$ python3 argv.py hello good
['argv.py', 'hello', 'good']

コマンドライン引数の型に気をつけよう

尚、sys.argvに格納される値は文字列です。
例えば以下のようなコードを試してみます。

#---------------
#  argv.py
#---------------
import sys

# コマンドライン引数をそれぞれ変数x, yに格納
x = sys.argv[1]
y = sys.argv[2]

# コマンドライン引数x, yの和を出力したい
print(x+y)

コマンドライン上で実行した結果を以下に示します。コマンドライン引数として設定した”1″, “2”は文字列として格納されるので、結果は文字列の結合というかたちで出力されています。


$ python argv.py 1 2
12

数値として扱えるように、int型に変換してみます。(下記★部)

#---------------
#  argv.py
#---------------
import sys
x = int(sys.argv[1]) ★
y = int(sys.argv[2]) ★

print(x+y)

スクリプトを実行した結果を以下です。期待取りの結果が得られました。

$ python argv02.py 1 2
3

もう少し実践的な例

これだけだとあまりに味気ないので、(sys.argvの長さ)< 2の場合(=sys.argv[0]のみの場合、即ち、コマンドライン引数が無い場合)はエラーメッセージを出すようにしました。
また、最後に確認のためsys.argvの中身を表示するようにしました。

#---------------
# sample.py
#---------------

import sys

# sys.argvの長さが2より小さい = コマンドライン引数無し
if len(sys.argv) < 2:
    print("No argument!")
    sys.exit()
print("Argument:{}".format(sys.argv[1]))

# sys.argvの内容を確認
print("sys.argv = {}".format(sys.argv))

このスクリプトを実行した結果は以下です。

$ python3 sample.py one two three
Argument:one
sys.argv = ['sample.py', 'one', 'two', 'three']

コマンドライン引数を省略した場合はエラーメッセージが表示されます。

$ python3 sample.py
No argument!

まとめ

今回は、Pythonでコマンドライン引数を使う方法のうち、最も簡単なsys.argvを直接取り込む使った方法についてまとめました。
この他、高度な設定が可能なPython標準ライブラリのargparseモジュールを使う方法や3rdParty製モジュールのclickなどを使う方法もあります。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project