設定ファイルを利用する
コマンドラインの引数やオプションでパラメタを与える方法もありますが、オプションが多数あるような場合などでは設定ファイルに記述しておき、それを読み込んで処理する方が実行が簡単になります。
Python での設定ファイル(コンフィグレーションファイル、構成ファイルとも呼ばれます)を処理するモジュールはとてもたくさんありますが、ここでは、次の3つについて説明することにします。
python式: 単純に式として記述し、モジュールとしてインポートして利用する。
configparse: Python の標準モジュール、設定ファイルをINI形式で記述する
PyYAML: 拡張モジュール、設定ファイルをYAML形式で記述する
python式 の利用例
別段、特別なモジュールは不要です。
文字列を設定する場合は、引用符('...'、"...") で囲む必要があります。
code: config.py
# python なのでシャープ記号以降行末までがコメントになります。
dbhost = 'localhost'
user = 'testuser'
passwd = 'p@ssw0rd'
dbname = 'test'
この設定ファイルが $HOME/.myapp/config.py にあることして、
読み込む場合は、次のようにインポートします。
code: config_python.py
# 次の4行は、環境変数 PYTHONPATH に $HOME/.myapp を設定することと同じ
import sys
from pathlib import Path
homedir = Path.home() / '.myapp'
sys.path.insert(0, str(homedir))
import config
print('dbhost => ', config.dbhost)
print(' user => ', config.user)
print('passwd => ', config.passwd)
print('dbname => ', config.dbname)
code: bash
$ python config_python.py
dbhost => localhost
user => testuser
passwd => p@ssw0rd
dbname => test
欠点としては、設定ファイルの配置場所の柔軟性がないことです。
また、プログラムを利用するユーザにもある程度のPython の知識が必要になってしまいます。
configparser の使用例
configparser は Windows のINIファイル形式で定義します。この形式の設定ファイルは、Linuxでも MySQLなどの多くのソフトウェアで採用されています。 例えば次のようなINIファイルでデータベースへ接続するために必要な情報が保存されているとしましょう。
code: config.ini
; セミコロンはINIファイルでのコメント行です。
# シャープで始めてもコメント行になります。
; デフォルトセクションで設定した内容はすべてのセクションに設定されます。
dbhost = localhost
user = testuser
passwd = p@ssw0rd
dbname = test
configparser では次のように読み込むことができます。
code: 0505_configparser.py
import configparser as config
parser = config.ConfigParser()
parser.read('config.ini')
for section_name in parser.sections():
print('SECTION: ', section_name)
for item in parser.items(section_name):
print('{key} => {val}'.format(key=item0,val=item1)) 実行してましょう。
code: bash
$ python 0505_configparser.py
SECTION: mysql
dbhost => localhost
user => testuser
passwd => p@ssw0rd
dbname => test
pyyml の使用例
YAML("YAML Ain't a Markup Language"(YAMLはマークアップ言語ではない)の略)も、プログラムでよく使われるデータ定義のフォーマットです。 Python でもYAMLを読み書きするための PyYAMLという拡張モジュールがあります。 拡張モジュールなのでインストールする必要があります。
conda コマンドは 実行環境によっては pip コマンドを使う場合もあります。
code: conda
$ conda install pyyaml
code: pip
$ pip install pyyaml
前述のデータベース接続情報をYAML形式で定義してみます。
code: config.yml
# コメント行。行頭に#を書くか...
mysql: # キー定義の後に#を書くか...
# 値が始まる前に書くとコメントになる
dbhost: localhost
user: testuser
passwd: p@ssw0rd
dbname: test
これを読み込むプログラムは次のようになります。
code: 0506_config_yaml.py
import yaml
with open('config.yml') as conf:
config = yaml.load(conf, Loader=yaml.SafeLoader)
print(' user => ', config'user') 実行してみましょう。
code: bash
$ python 0506_config_yaml.py
dbhost => localhost
user => testuser
passwd => p@ssw0rd
dbname => test