Pythonの配布パッケージに.py以外のファイルを含めたいとき
PythonのコードでYAMLやJSONのファイルを参照していて、そのファイルをパッケージに含めたいときにどうすればよいか解説します。
そのようなファイルは「リソース」と呼ばれます。
コードの書き方
リソースをopenで読み込むと単体試験ではうまくいきますが、パッケージにするとうまく動きません。
リソースの読み込みにはimportlibを使います。
from importlib import resources str_data = resources.read_text('パッケージ名', 'リソース名'))
「パッケージ名」はリソースが置いてあるパッケージの名前です。
resource.read_textはstr型のデータを返します。JSONであればjson.loads(str_data)でdict形式に変換するとよいでしょう。
importlibはPython3.7からです。Python3.7未満の環境ではpkg_resourcesのを使うそうです。
配布パッケージの作り型
以前、配布パッケージの作り方を紹介しました。
この方法だと.py以外のファイルはパッケージに含まれません。
リソースをパッケージに追加するにはsetup.pyに以下の2行を追加します。
package_data={'パッケージ名': ['リソース名']}, include_package_data=True,
パッケージ名を空('')にすると「全てのパッケージ」という意味になります。
リソース名にはワイルドカードが使えます。
後は普通にsdistなどを作ればOKです。