設定ファイルは簡単です: Python の configparser モジュール
今週末2本目のPython記事ということでお分かりいただけると思いますが、仕事でも家でも少しずつPythonコーディングをしています。Pythonは作業しやすい言語で、大きなメリットの一つは「バッテリー内蔵」の哲学です。
他の言語では、アドオンモジュールをダウンロードしてインストールするのが非常に一般的です。例えば、PerlのCPANやPHPのPearなどです。もちろん、GoLangはGitHubを使うためにほぼゼロから構築されています。Pythonには確かに強力なアドオンモジュールコミュニティ(「pip」を参照)があり、すぐに使える機能も豊富に含まれています。スクリプト言語の歴史を振り返ると、PerlとTCLは比較的ライブラリが少なかったです。Python以降、多くの言語は、何を同梱すべきかについてより広範な視点を持つようになりました。
今日のチュートリアルでは、Pythonの「configparser」モジュールを見ていきます。このモジュールの素晴らしい点は、設定ファイルの解析ロジックをもう手書きする必要がなくなることです。今はそれほど多くのコードを書いておらず、YAML、JSON、あるいは(ゾッとしますが)XMLなどを使っていることを願います。そうでない場合、あるいはもっとシンプルなものを探している場合は、configparserがきっと気に入っていただけるでしょう。
configparser は .ini ファイルを処理します。サンプルを見てみましょう。
[サーバ] 最大処理ファイル数 = 12 入力ディレクトリ = /tmp/input 出力ディレクトリ = /tmp/output [ログ記録] ログディレクトリ = /tmp/log デバッグ = いいえ
これを「leb.ini」として保存しました。この設定ファイルには2つの「セクション」(サーバーとログ)があり、それぞれに複数の設定項目があります。
この獣を解析してみましょう!
#!/usr/bin/python3 configparserをインポートする config = configparser.ConfigParser() config.read('leb.ini') config.sections() のセクションの場合: print ("見つかった設定セクション: %s" % (section)) wants_debug = config['logging'].getboolean("デバッグ") wants_debug の場合: print ("これはデバッグ出力です") それ以外: print ("デバッグはオンになっていません") print ("%s から最大 %d 個のファイルを処理しています" % ( config["server"].getint("MaxFilesToProcess"), config ["サーバー"]["入力ディレクトリ"])) config['logging'].keys() に 'notify_address' がある場合: 印刷 ("通知が設定されています") それ以外: 印刷 ("通知が設定されていません")
ここでは、読みやすくするために、いくつかの長い行を折り返しています。
このスクリプトを実行すると、次の出力が生成されます。 # ./server.py 見つかった設定セクション: サーバー 見つかった設定セクション: ログ記録 デバッグがオンになっていません /tmp/inputから最大12個のファイルを処理しています 通知が設定されていません
コードを見ていきましょう。まず、configparserをインポートし、configというConfigParserオブジェクトを作成し、leb.iniファイルを読み取るように指示します。
config.sections() は、セクション「server」と「logging」を指定します。この場合、.ini ファイルではすべての項目をセクションにまとめる必要があることに注意してください。「裸の」設定項目を持つことはできません。設定がシンプルな場合はセクションを1つだけ指定することもできますが、少なくとも1つは必要です。
さて、これらの設定項目を参照してみましょう。これらの設定項目は文字列として保存されているので、config[“logging”][“Debug”] を参照すると、.iniファイルに記述した文字列「no」が返されます。私が本当に求めているのは、ブール値のTrueまたはFalseです。これを取得するには、getboolean()メソッドを使用します。このメソッドは、yes/no、on/off、true/false、1/0を正しく理解します。
また、設定項目を整数として取得するには getint() を、浮動小数点数を取得するには getfloat() を使用します。もちろん、次のようにすることもできます。
int(config["サーバー"]["プロセス最大ファイル数"])
MaxFilesToProcess が int ではなく、getint() または int() キャストのいずれかを試行すると、Python は (予想どおり) ValueError を発生させます。
最後に、設定項目が存在するかどうかをどのように確認するのでしょうか。config 変数は単なる辞書なので、config['logging'].keys() のキーとして 'notify_address' が含まれているかどうかをテストするなど、一般的な Python 辞書操作を使用できます。