プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Pythonの配布パッケージに.py以外のファイルを含めたいとき

PythonのコードでYAMLJSONのファイルを参照していて、そのファイルをパッケージに含めたいときにどうすればよいか解説します。

そのようなファイルは「リソース」と呼ばれます。


コードの書き方

リソースを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のを使うそうです。


配布パッケージの作り型

以前、配布パッケージの作り方を紹介しました。

architecting.hateblo.jp

この方法だと.py以外のファイルはパッケージに含まれません。

リソースをパッケージに追加するにはsetup.pyに以下の2行を追加します。

package_data={'パッケージ名': ['リソース名']},
include_package_data=True,

パッケージ名を空('')にすると「全てのパッケージ」という意味になります。

リソース名にはワイルドカードが使えます。

後は普通にsdistなどを作ればOKです。