Skip to main content

コマンドライン引数の処理(optparse)

Python

ArgumentParser を使う OptionParser クラスを使う deprecated

getopt とか OptionParser はオプション引数のみ対象にしているが、 ArgumentParser はオプション引数も位置引数も扱えるので便利で良い

py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', action='store_true')
parser.add_argument('-g', '--group-name', action='store', default="test", help="Group name is group name")
parser.add_argument('--max-lines', default=1000, type=int)

parser.add_argument('basedate', nargs='?') # '?' は 0 or 1、'*' は可変(0コ以上)、'+'は1コ以上、なのだと思う

args = parser.parse_args()
if args.basedate == None:
..

指定可能な書式

bash
./a.py -f a.txt
./a.py -fa.txt
./a.py --file=a.txt
./a.py --file a.txt
項目内容
optionstore で指定した名前のメンバをもつオブジェクト
args名前なしの引数が配列で入る

| action | 動作 | 使いみち | |:-|:-| | store | 値つきの引数 | --file a.txt | | store_true | 指定したら true に | --enable-xxmode |

その他

  • 型を指定すると、型チェックをしてくれる
  • 正規表現とかでのチェックもできたらなあって思ったけど、下のように自分でやれ方式のようだ
py
if options.a === 'xx':
parser.error('a should be xx')

TODO: Help の Formatterの指定。デフォルト値とか出せるのだっけ

Bash

Bash 組み込みの getopts gnu コマンドの getopt

  • いろいろ出来そうだが、いろいろ頑張るならもう python とかでいいよねってなった頃

Ruby

OptionParser クラスを使う

rb
引数の処理 (OptionParser, optparse)

require 'optparse'
opt = OptionParser.new

opt.on('-a') {|v| v1 = v } # -a が指定された時に v は true
opt.on('-b filename') {|v| v2 = v } # v は指定した引数 (-b の直後の文字列)
opt.on('-c [message]') {|v| v3 = v } # 省略可能な引数
opt.on('-d, --del') {|v| v4 = v } # --xxx 形式も受け付ける
opt.on('--echo') {|v| v5 = v } # --xxx 形式も受け付ける
opt.on('--[no-]file') {|v| v6 = v } # --no-file と指定すると v は false
opt.on('--group[=gid]') {|v| v7 = v } # --xxx 形式も引数を指定可能
opt.on('-i', 'あああ') {|v| v8 = v } # --help で出るメッセージを指定

begin
opt.parse!(ARGV) # ARGVを解釈
# ※ "!" をつけるとARGVから "-x" は取り除かれる)
rescue OptionParser::InvalidOption => e
puts e.message # 「invalid option: -t」のように出る
end