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

Packaging python resources (Manifest.in vs package_data vs data_files)

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

  1. Manifest.in 文件(我不确定什么时候这个比 package_data 或 data_files 更受欢迎)
  2. package_data in setup.py(用于在 python 导入包中包含资源
  3. data_files in setup.py(用于包含资源 outside python import packages)
  4. 一个叫做 setuptools-scm 的东西(我相信它使用你的版本控制系统而不是 manifest.in 或其他东西来查找资源)
  • 哪些可以从 importlib.resources 访问?
    (据我了解,importlib.resources 是访问此类资源的首选方式。)如果无法通过 importlib.resources 访问任何这些资源,那么 could/should 如何访问此类资源?

  • 其他网友被骂建议使用__file__查找资源路径,因为安装的wheel发行版可能存储为zip文件,因此甚至不会成为您资源的正确路径。 什么时候将轮子提取到站点包中,什么时候保持压缩状态?

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

使每个子目录成为一个包

至于为什么不使用__file__:Pythons导入系统有一些奇怪的方法来解析包。例如,如果您使用 Zipapp,它可以在 zip 文件中查找它们。 你甚至可以为你被要求从中加载一些资源的包定制加载器。 谁知道这些资源位于何处?答:importlib.resources.

A​​faik,车轮不是竞争者,因为它们已拆包。