打包Python资源(Manifest.in vs package_data vs data_files)

Jac*_*own 5 python resources setuptools python-importlib

似乎非 python 资源包含在 python 分发包中的四种方式之一:

  1. Manifest.in 文件(我不确定这何时优于 package_data 或 data_files)
  2. package_data in setup.py(用于python 导入包中包含资源)
  3. data_files in setup.py(用于包含python 导入包之外的资源)
  4. 所谓的东西setuptools-scm(我相信它使用你的版本控制系统来查找资源而不是manifest.in或其他东西)
  • 其中哪些可以从 访问importlib.resources
    (据我了解,这importlib.resources是访问此类资源的首选方式。)如果其中任何一个无法通过 访问importlib.resources,那么人们如何能够/应该访问这些资源?

  • 网上其他人因使用查找资源路径的建议而受到责骂__file__,因为安装的 Wheel 发行版可能存储为 zip 文件,因此甚至不会有正确的资源路径。轮子什么时候被提取到站点包中以及什么时候它们保持拉链状态?

Wol*_*ehn 2

所有 (1)-(3) 都会将文件放入您的包中(不知道 (4))。在运行时,importlib.resources将能够访问包中的任何数据。至少Python 3.9可以访问子目录中的资源。以前,您必须通过添加__init__.

至于为什么不使用__file__:Python 的导入系统有一些奇怪的方法来解析包。例如,如果您使用 Zipapp,它可以在 zip 文件中查找它们。您甚至可能有一个自定义加载程序,用于要求您从中加载一些资源的包。谁知道这些资源在哪里?答:导入lib.resources。

老实说,车轮不是一个竞争者,因为它们是拆开包装的。