現在、フォント制作に使用している、SVGを分割するPerlスクリプトを、Python3に移植中です。
引数の処理をPythonの流儀に合わせようと検索したところ、
『馴染みのあるヘルプを文法に従って書けばパーサを生成してくれます』(リンク先サイト様より引用)というdocoptが紹介されているのを発見。
githubのプロジェクトページによると、MITライセンス。
とても良さそうだったので、導入ついでに引数オプションをいろいろ変更することに。
変数名とコードの整理だけの純粋な移植をするつもりが、早速機能を盛ってしまいました。趣味プログラミングでこれを抑制するのは本当に難しい。
Ubuntu14.04へのdocoptモジュール導入を導入する際、普通にpipコマンドを使うと、Python2の方にdocoptが導入されます。私はPython3で使いたいので、
sudo apt-get install python3-docopt
にてPython3側に導入しました。
以下が、動作確認に使ったコードです。
#!/usr/bin/python3
"""Process some integers.
usage: this_script.py [-h] <src_image> <listfile> [--output_dir=<DIR_OUT>] [--width=<NUM_WIDTH>] [--height=<NUM_HEIGHT>]
options:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
--output_dir=<DIR_OUT> splitted SVG images output dir [default: glyphs_/]
--width=<NUM_WIDTH> width for unit of split base squared(cross-section) [default: 1000]
--height=<NUM_HEIGHT> height for unit of split base squared(cross-section) [default: 1000]
"""
from docopt import docopt
from pprint import pprint
if __name__ == '__main__':
args = docopt(__doc__)
numWidth = args["--width"]
numHeight = args["--height"]
widthUnit = numWidth #
heightUnit = numHeight #
print(widthUnit)
print(heightUnit)
pprint(args)
"""Process some integers.
usage: this_script.py [-h] <src_image> <listfile> [--output_dir=<DIR_OUT>] [--width=<NUM_WIDTH>] [--height=<NUM_HEIGHT>]
options:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
--output_dir=<DIR_OUT> splitted SVG images output dir [default: glyphs_/]
--width=<NUM_WIDTH> width for unit of split base squared(cross-section) [default: 1000]
--height=<NUM_HEIGHT> height for unit of split base squared(cross-section) [default: 1000]
"""
from docopt import docopt
from pprint import pprint
if __name__ == '__main__':
args = docopt(__doc__)
numWidth = args["--width"]
numHeight = args["--height"]
widthUnit = numWidth #
heightUnit = numHeight #
print(widthUnit)
print(heightUnit)
pprint(args)
コマンドによる呼び出しと出力結果は以下のとおり。
python3 docopt_t.py RuneAMN.svg RuneAMN.list --output_dir=amn/ --width=800 --height=800800
800
{'--height': '800',
'--output_dir': 'amn/',
'--width': '800',
'-h': False,
'<listfile>': 'RuneAMN.list',
'<src_image>': 'RuneAMN.svg'}
オプション引数名は『<angular-brackets> or UPPER-CASE』で指定しなければならないなど、記述フォーマットにいくつかのルールがあるようです。
とりあえず、docoptを記述した『"""形式コメント""" 』は他のコメントより前に置きましょう。他のコメントを前に書くとdocoptが機能しませんでした。ただし、『#』形式コメントが前にあっても問題なく機能します。
なお、直観に反して、[defailt: 値]の指定はデフォルト値を入れてくれるわけではないようです。いろいろ調べるより、自分でNoneをチェックしてデフォルト値を入れる処理を書いたほうが楽です。
docopt取得値の確認にはpprintが便利でした。