[Python]コマンドラインで引数を渡したい。argparseの基本を学ぶ

python argparseの基本を学ぶ 独学Python

私は頻繁に誰か様が描いてくださったコード・レポジトリをgithubからcloneして、自分用にカスタマイズする。
そのせいもあり、あまり基本的なコードを一から書いたりする機会が少ない。
備忘録として、argparseについて書いておく。

スポンサーリンク

公式

どこかの誰かがなんというまいが、公式が全てだと思っている
しかしながら、公式ドキュメントと言うのは、あまりにも情報がぎゅっとされていて、凡人の私には理解が難しい時がある。
わかりやすい言葉でできる限り簡単にまとめたい。

argparse --- コマンドラインオプション、引数、サブコマンドのパーサー
ソースコード: Lib/argparse.py チュートリアル: このページは API のリファレンス情報が記載しています。 argparse チュートリアル では、コマンドラインの解析についてより優しく説明しています。 argparse モジュールは、ユーザーフレンドリーなコマンドラインインターフェースの作成を簡単に...

基本形

基本形は下記、これに色々付け足していく形となる。
ArgumentParserがコマンドラインとスクリプトの中心的存在となっている。
parse_argsメソッドでパースを実行し、入力した引数をNamespaceオブジェクトに配置する。

import argparse # argparseモジュールをimport

parser = argparse.ArgumentParser() # ArgumentParserインスタンス生成
args = parser.parse_args() # parse_argsメソッド呼び出し

print(args)

> python test_argparse.py

Namespace()

引数を何を入力していないので、Namespaceには何も配置されていない。

以下で引数の設定についてみていこう。

コマンドライン引数入力を強制する

parser.add_argument()メソッドで各引数の仕様をparserに与えていく。

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("arg_1") # 引数を指定(位置引数)
args = parser.parse_args() 

print(args)

スクリプト実行時にコマンドラインで引数を与えてあげることで, Namespaceに値が入っていることが確認できる。

> python test_argparse.py 100

Namespace(arg_1="100")

(後述するrequiredを使うことでコマンドライン引数の入力を必須にすることも可能)

コマンドライン引数の入力を任意にする

ハイフンを2つつけることでコマンドライン引数の入力を任意にすることができる。
parser.add_argument("--arg_2")

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("arg_1") # 引数を指定
parser.add_argument("--arg_2") # オプション引数
args = parser.parse_args() 

print(args)
> python test_argparse.py 100

Namespace(arg_1="100" arg_2=None)

# add_argumentで指定した引数名の後に半角空けて、渡したい値・文字を入力する
> python test_argparse.py 100 --arg_2 200

Namespace(arg_1="100" arg_2=200)

# 引数名の入力がめんどくさいときにはハイフン1つと引数名の頭文字でも可能
> python test_argparse.py 100 -a 200

Namespace(arg_1="100" arg_2=200)

add_argumentの他の機能

type : input typeを指定する

type=指定したい型で型指定が可能

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("--arg_1", type=int) # int型を指定
parser.add_argument("--arg_2", type=str) # str型を指定
args = parser.parse_args() 

print(args)

> python test_argparse.py --arg_1 100 --arg_2 200
Namespace(arg_1=100, arg_2='200')

# int型指定の引数に文字を入力するとエラーになる
> python test_argparse.py --arg_1 hello --arg_2 200
test_argparse.py: error: argument --arg_1: invalid int value: 'hello'

required : 入力を必須にする

required=True, Falseで指定できる

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("--arg_1", type=str, required=True)
args = parser.parse_args() 

print(args)
# required=Trueにした引数がないとエラーになる
> python test_argparse.py 
test_argparse.py: error: the following arguments are required: --arg_1

# 正常な挙動
> python test_argparse.py --arg_1 hello 
Namespace(arg_1="hello")

default : default値を設定する

引数の指定がない際に使われる値を設定する

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("--arg_1", type=int, default=10000)
args = parser.parse_args() 

print(args)
# required=Trueにした引数がないと上記で設定したdefault値になる
> python test_argparse.py 
Namespace(arg_1=10000)

# 指定すると値が反映される
> python test_argparse.py --arg_1 30
Namespace(arg_1=30)

choices : 決められた候補の値から選ぶようにする

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("--arg_1",  choices=["one", "two", "three"])
args = parser.parse_args() 

print(args)
# 何も指定しない場合にNamespaceに返される値
> python test_argparse.py        
Namespace(arg_1=None)

# choicesにない値を指定するとエラーになる
> python test_argparse.py --arg_1 four
usage: test_argparse.py [-h] [--arg_1 {one,two,three}]
test_argparse.py: error: argument --arg_1: invalid choice: 'four' (choose from 'one', 'two', 'three')

# 通常の挙動
> python test_argparse.py --arg_1 one 
Namespace(arg_1='one')

action

actionにも色々あるが、代表的なstoreについてのみ記述する

store系 : 設定した値を返す

store系には主に三つある

  • store_const
  • store_true
  • store_false

引数が与えられたときにconst, true, falseをそれぞれ返す。スイッチみたいな役割をしている。
store_constの場合は別でconstを指定する。

import argparse

parser = argparse.ArgumentParser() 
parser.add_argument("--arg_1", action = "store_const", const=100) 
parser.add_argument("--arg_2", action = "store_true")
parser.add_argument("--arg_3", action = "store_false")
args = parser.parse_args() 

print(args)
# 何も指定しない場合にNamespaceに返される値
> python test_argparse.py        
Namespace(arg_1=None, arg_2=False, arg_3=True)

# 指定するとそれぞれ値が反映される
> python test_argparse.py --arg_1 --arg_2 --arg_3
Namespace(arg_1=100, arg_2=True, arg_3=False)

まとめ

実際にコードを書いて、実行してみることで挙動がよく理解できる。
これぐらいのコードであれば簡単に実行できるので、動かしながら確認するようにするのが良い

コメント

タイトルとURLをコピーしました