LoginSignup
6
15

More than 3 years have passed since last update.

pythonでコマンドライン引数を受け取る (sys.argv, argparse)

Last updated at Posted at 2019-09-25

pythonコードでコマンドライン引数 (terminalで実行する際につけられる引数) を受け取る操作をまとめます。

argparse公式ドキュメント
https://docs.python.org/ja/3/library/argparse.html#

試行環境

Windows10
python3.6

sys.argvを使うやり方

こっちは簡単です。sys.argvがファイル名と引数を文字列で格納したlistになっているのでこれを使うだけです。

test.py
import sys

if __name__ == "__main__":
    print(sys.argv)
    print(len(sys.argv))
    print(type(sys.argv))
コマンドプロンプト
(base) > python test.py a b 10 3.14
['test_receive_value1.py', 'a', 'b', '10', '3.14']
5
<class 'list'>

でもparseは自分でやらないといけませんのでちょっと面倒です。

argparseを使うやり方

argparse.ArgumentParser()を定義しておくと自動でparseしてくれます。

test2.py
import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='プログラムの説明')  # parserを定義

    # 受け取る引数を追加する
    parser.add_argument('arg1', help='引数arg1の説明')  # 必須の引数を追加
    parser.add_argument('arg2', help='引数arg2の説明')
    parser.add_argument('--arg3')  # オプション引数(指定しなくても良い引数)を追加
    parser.add_argument('-a', '--arg4')  # '-a'が省略形、'--arg4'が正式名のオプション引数

    args = parser.parse_args()  # 引数を解析

    print('arg1=', args.arg1)
    print('arg2=', args.arg2)
    print('arg3=', args.arg3)
    print('arg4=', args.arg4)

省略したものはNoneが入ります。

コマンドプロンプト
> python test_receive_value2.py hoge fuga --arg3 uga
arg1= hoge
arg2= fuga
arg3= uga
arg4= None

-hオプションで使い方を確認することも出来ます。

コマンドプロンプト
> python test2.py -h
usage: test_receive_value2.py [-h] [--arg3 ARG3] [-a ARG4] arg1 arg2

プログラムの説明

positional arguments:
  arg1                  引数arg1の説明
  arg2                  引数arg2の説明

optional arguments:
  -h, --help            show this help message and exit
  --arg3 ARG3
  -a ARG4, --arg4 ARG4

現代的な引数処理をやろうと思ったらargparse.ArgmentParser()を使うやり方が良さそうです。

argparse応用編

以下はこちらの内容そのままです
https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

省略した場合のdefault値を指定する

python
parser.add_argument('--message', default='hello!')

data型を指定する

python
parser.add_argument('--number', type=int)    # 整数値(int)
parser.add_argument('--alpha', type=float, default=0.01)    # 実数値(float)

呼ばれただけでTrueや定数を格納する

引数を与えなくても--hogeが呼ばれるだけで何かするようにできます。以下だとTrueが入ります。

python
parser.add_argument('--flag', action='store_true')

定数を入れたい場合は以下のようになります。

python
parser.add_argument('--flag', action='store_const', const=3.14)

選択肢にある引数しか受け取らない

python
parser.add_argument('--fruit', choices=['apple', 'banana', 'orange'])

複数個まとめて受け取る

nargs='*' で任意の数の引数を受け取るように出来ます。

python
parser.add_argument('--colors', nargs='*')
コマンドプロンプト
(base) > python test.py --colors red green blue
['red', 'green', 'blue']

nargs=3 などのように数を指定することもできます。

順不同で良いけど必須の引数を作る

python
parser.add_agument("-a", required=True)

かなり色々できて面白いです。レッツトライ!

参考にしたページ

https://qiita.com/taashi/items/07bf75201a074e208ae5
https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

6
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
15