问题描述
似乎python分发软件包中包含了非python资源,这是以下4种方法之一:
- Manifest.in文件(我不确定何时首选package_data或data_files文件)
- package_data(用于在python导入包中包含资源 )
- data_files(用于包括外部 python导入包中的资源)
- 一种叫做
setuptools-scm
的东西(我相信它使用您的版本控制系统来查找资源,而不是manifest.in之类的东西)
setup.py
中的setup.py
中的-
其中哪些可以从
importlib.resources
访问?
(据我了解,importlib.resources
是访问此类资源的首选方式。)如果其中任何一个都无法通过importlib.resources
访问,那么一个人应该/应该如何访问此类资源? -
由于建议安装
__file__
来查找资源的路径,因此网上其他人遭到了指责,因为已安装的车轮分布可能存储为zip文件,因此甚至没有正确的路径您的资源。 何时将轮子提取到站点包装中,何时保持压缩状态?
解决方法
所有(1)-(3)都会将文件放入您的包中(不知道(4))。
这样,importlib.resources
就可以在运行时访问包中的任何数据。
至少使用Python 3.9,它可以访问子目录中的资源。
以前,您必须通过添加__init__
来使每个子目录成为一个包。
至于为什么不使用__file__
:Python的导入系统具有一些奇怪的方式来解析软件包。例如,如果您使用Zipapp,它可以在zip文件中查找它们。
您甚至可能为要求您从中加载一些资源的程序包提供了自定义加载器。
谁知道这些资源在哪里?回答:importlib.resources。
Afaik,车轮拆开后,它们不是竞争者。