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 ライブラリに含まれているんだなと気づきました)
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 を使うとよいようです。
最初のコードを書き換えると以下のようになります。
- 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にてライブラリ内のファイルを参照することができました。
皆様の参考になれば幸いです。



Discussion