はじめに
CLIでpythonプログラムを実行するときに引数指定をするならgetoptを使うので
基本的な動きを色々と試してみた。
基本的な使い方
参考URL:https://szarny.hatenablog.com/entry/2017/08/17/231356
書式
import getopt
opts,args = getopt.getopt(text, shortopts, longopts=[])
例
import getopt
opts,args = getopt.getopt(
sys.args[1:],
"hle:t:cp:,
["help", "listen", "execute=","target=","command","port=" )
引数 | 説明 |
---|---|
opts | 引数を解析した対象。shortopts, longoptsに合致する対象がリスト形式でセットされる |
args | 引数を解析した対象。shortopts, longoptsに合致しない対象がリスト形式でセットされる |
text | 引数を解析する対象。プロンプトから与える引数であればsys.args[1:]でOK |
shortopts | 略記でのオプション指定。引数が必要なオプションはコロンを付ける。例でいうと、h,l,cは引数不要でe,t,pは引数必要なオプション |
longopts | 詳記でのオプション指定。リスト形式で指定する。引数が必要なオプションはイコール(=)を付ける。例でいうと、execute, target, portが引数必要 |
なお、shortoptsとlongoptsはそれぞれ対応するのでそこんところ気を付けたらよいです。
実装例
色々試したので余計なコードも混ざってますが…
show_arg.py
import sys
import getopt
def main():
if not len(sys.argv[1:]):
print("argument is nothing")
sys.exit()
text = sys.argv[1:]
try:
opts,args = getopt.getopt(
text,
"t:p:m:h",
["target=", "port=", "message=", "hogehoge"]
)
print("Options:", opts)
print("Arguments:", args)
except getopt.GetoptError as err:
print(str(err))
main()
print("finished")
実行結果はコチラ。略記指定ならハイフンひとつ。詳記指定ならハイフンふたつ。
一回目はshortopts、longoptsを試してみた結果(argsに入りそうな結果は出ないパターン)
二回目はargsに値が入ってくるように引数をセットしてみた結果
実行結果
$ python show_arg.py -t 127.0.0.1 -p 8888 --message hello --hogehoge
('Options:', [('-t', '127.0.0.1'), ('-p', '8888'), ('--message', 'hello'), ('--hogehoge', '')])
('Arguments:', [])
finished
$ python show_arg.py -t 127.0.0.1 -p 8888 --message hello --hogehoge hoge hage hige
('Options:', [('-t', '127.0.0.1'), ('-p', '8888'), ('--message', 'hello'), ('--hogehoge', '')])
('Arguments:', ['hoge', 'hage', 'hige'])
finished
$
おわりに
getops、sys.argvとセットで使えるようにしとくと超便利でした。