「作れば分かる本」のPython写経では、app.yamlのapplicationを修正してGitHubへ上げていた。
ただ、さすがに何度も同じことを手動で行うのはよくないので、Pythonプログラムを作成した。そのメモ。
■実装するときに悩んだことと対応
似たようなソースコードがないかを探したところ、以下を組み合わせればできそうだった。あとはそれぞれのソースコードの理解のみ。
- komagata - Pythonのコードを添削してもらいました (引数の受け取りと、yamlの出力)
- progd - PyYAMLモジュールを使ってPythonからYAMLを読む (yamlの読込)
- gihyo.jp - 言語別 YAML用ライブラリ徹底解説 - 第3回 Python編 (PyYAMLの使い方)
「if __name__ == '__main__':」とは何か?
GoogleAppEngineで作成するときには気にしなかったが、Web上では上記が含まれているソースコードを目にする機会が多い。
調べたところ、
ifの中身はスクリプトファイルとして実行された時にだけ実行されるらしい。
へたれプログラマな日々 - if __name__ == '__main__': について
とのことらしい。
コマンドラインからの引数の受け取り
sys.argvを使うとのこと。
Yukun's Blog - Python: コマンドライン引数の取得 – sys.argv変数
「sys.exit(1)」とは何か?
ドキュメントによると、「Pythonをステータス"1"(異常終了)として終了する」のように読み取れました。
Python 2.7ja1 documentation - 27.1. sys ― システムパラメータと関数
以下の様な記事もあり、例外の時にはsys.exit(1)のように使うのがよさそう。
蟲!虫!蟲! - Pythonであんまり意識しなかった"return 0"と"sys.exit()"について
■ソースコード
gistにも上げました。
2012.11.02 追記
最初記載したコードでは、app.yamlの記述順が変わった状態で出力されてしまうため、ソースコードを差し替え。
最初記載したコードは、gistを参照ください。
# -*- coding: utf-8 -*- import sys import yaml from collections import OrderedDict # OrderedDictを出力するための関数 def represent_odict(dumper, instance): return dumper.represent_mapping(u'tag:yaml.org,2002:map', instance.items()) # OrderedDictを読み込むための関数 def construct_odict(loader, node): return OrderedDict(loader.construct_pairs(node)) def main(path, convertedPath): # 記述順で読み込めるようにadd_constructorで設定 yaml.add_constructor(u'tag:yaml.org,2002:map', construct_odict) data = yaml.load(open(path).read().decode('utf-8')) data['application'] = u'<your application id>' # OrderedDictを出力できるように、add_representerにて設定 yaml.add_representer(OrderedDict, represent_odict) yaml.dump( data, file(convertedPath, 'w'), default_flow_style=False, encoding='utf-8', allow_unicode=True ) if __name__ == '__main__': if len(sys.argv) < 2: print 'Usage: %s [filename]' % sys.argv[0] sys.exit(1) path = sys.argv[1] convertedPath = path.replace('.yaml', '_forGitHub.yaml', path.rindex('.')) main(path, convertedPath)