getopt.getopt関数でコマンドライン引数を分析する

「ゲットオプト、ゲットオプト・・・」

Pythonでコマンドライン引数をエレガントに処理するためには、getoptの呪文を唱えなければならない。

コマンドライン引数の取得

sys.argvで、Pythonスクリプトを含めたコマンドライン引数全体にリストとしてアクセスできる。

(Python3用サンプルスクリプト) getargs.py

# -*- utf-8 -*-
# コマンドライン引数を表示するプログラム

import sys

print(sys.argv)     # スクリプトファイル名とコマンドライン引数を表示する。
print(sys.argv[1:]) # コマンドライン引数のみを表示する。

(実行結果)

$ python3 getargs.py -abc --lang=jp --editor=emacs Python Ruby Java
['getargs.py', '-abc', '--lang=jp', '--editor=emacs', 'Python', 'Ruby', 'Java']
['-abc', '--lang=jp', '--editor=emacs', 'Python', 'Ruby', 'Java']

これを踏まえ、いよいよコマンドラインオプションをやっつける。(炎o炎)

getopt.getoptでコマンドラインオプションを華麗にさばく

「ゲロップ、ドッ、ゲロップ」 (「getopt.getopt」をアメリカ人が発音するとこのように聞こえるらしい)
getopts.getopts関数の書式は以下の通り。

getopt.getopt(コマンドライン引数のリスト, 一文字オプションの文字列, 長いオプション文字列のリスト)

コマンドライン引数のリスト:
sys.argv[1:]で取得できる。

一文字オプションの文字列:
“abc”や”xyz”など。
オプションが引数を取るときは、文字の後ろに:(コロン)をつける。 → “ab:c”

長いオプション文字列のリスト:
[“aaa”, “bbb”, “ccc”]や[“hello”, “world”]など。
オプションが引数を取るときは、文字列の後ろに=(イコール)をつける。
→ [“hello”, “world”, “lang=”]

それでは、いよいよサンプルスクリプトを書いてみよう。

(Python3用サンプルスクリプト) procarg.py

# -*- coding: utf-8 -*-
# コマンドライン引数を処理するサンプルスクリプト

import sys
import getopt

try:
    # おかしなオプションを指定すると、getoptGetoptError例外が発生する。
    opts, args = getopt.getopt(sys.argv[1:], 'abc:', ['lang=', 'editor=', 'silent'])
    print("オプション:", opts)
    print("引数:", args)
except getopt.GetoptError as err:
    print("オプションの指定が間違っています。")
    print(str(err))
    sys.exit(0)

(実行結果)

$ python3 procarg.py -b -c hello --lang=jp --silent --editor=emacs Python Ruby Java
オプション: [('-b', ''), ('-c', 'hello'), ('--lang', 'jp'), ('--silent', ''), ('--editor', 'emacs')]
引数: ['Python', 'Ruby', 'Java']

コマンドラインオプションを退治した。

参考サイト

getoptモジュールのドキュメント

Pythonプログラミング物語 © 2016 Frontier Theme