📦

DeprecationWarning: pkg_resources is deprecated as an API に対応する

に公開

背景

Python のライブラリを実装している時にコード内でライブラリに含まれている画像データを参照したい時などに今まで pkg_resources.resource_filename を用いていました。

import pkg_resources

image_path = pkg_resources.resource_filename('my_package', 'data/image.png')

with open(image_path, 'rb') as f:
    image_data = f.read()

しかしこのコードを実行時に以下のエラーが表示されます。

DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  import pkg_resources

どうやら将来的に使えなくなってしまうようで、そのまま使ってもよいですが、せっかくなので今は何を使うのが推奨されているのかと調べてまとめてみました。

方法

上記の URL を確認しに行きました。 (そして今さらながら pkg_resources って setuptools ライブラリに含まれているんだなと気づきました)

https://setuptools.pypa.io/en/latest/pkg_resources.html

Attention のところに代わりに使うべきライブラリが書かれていますね。

Use of pkg_resources is deprecated in favor of importlib.resources, importlib.metadata and their backports (importlib_resources, importlib_metadata). Some useful APIs are also provided by packaging (e.g. requirements and version parsing). Users should refrain from new usage of pkg_resources and should work to port to importlib-based solutions.

Python のネイティブライブラリの importlib.resources.files を使うとよいようです。

https://docs.python.org/3.11/library/importlib.resources.html#importlib.resources.files

最初のコードを書き換えると以下のようになります。

python
- import pkg_resources
+ import importlib

- image_path = pkg_resources.resource_filename('my_package', 'data/image.png')
+ image_path = importlib.resources.files('my_package.data').joinpath('image.png')

with open(image_path, 'rb') as f:
    image_data = f.read()

💡 ライブラリの階層を / で表してたところが . になるのに要注意です

setuptools の依存もなくなっていい感じですね。

💡 まとめ

  • DeprecationWarning: pkg_resources is deprecated as an API という警告に対応しました。
  • pkg_resources.resource_filename を用いずに importlib.resources.files にてライブラリ内のファイルを参照することができました。

皆様の参考になれば幸いです。

Cykinso's Tech Blog

Discussion