使用setuptools/distribute打包资源

10 python setuptools distribute pypi

我正在开发一个具有几个.txt依赖项的Python egg(它们是用于通过egg本身生成文件的模板),而且我很难将这些依赖项复制到site-packages期间setup.py install.根据distribute文件 ......

我的包的文件系统:

setup.py
package
|--- __init__.py
|--- main.py
|--- binary (calls main.py with pkg_resources.load_entry_point)
|--- templates
     |--file1.txt
     |--file2.txt
Run Code Online (Sandbox Code Playgroud)

在setup.py中:

setup(
    [...]
    eager_resources = ['templates/file1.txt', 'templates/file2.txt']
)
Run Code Online (Sandbox Code Playgroud)

在我的包裹内:

from pkg_resources import resource_string
tpl = resource_string(__name__, 'templates/file1.txt')
Run Code Online (Sandbox Code Playgroud)

...配置和文件系统的这种组合应该导致file1.txtfile2.txt通过pkg_resources.resource_string.不幸的是,他们没有被复制到site-packages期间setup.py install.我错过了什么?

谢谢!

小智 5

您是否在此处查看了包含包数据的 setuptools 文档:https ://setuptools.readthedocs.io/en/latest/setuptools.html#include-data-files

基本上,您只需要include_package_data=True在 setup.py 文件中进行设置。如果您使用 subversion 或 CVS,则将包含所有版本化文件。如果没有,您可以指定在 MANIFEST.in 文件中包含哪些文件。

我相信分发也支持这一点。

然后,您可以像访问这些文件一样访问这些文件,而无需对其进行打包。即在 main.py 你可以有:

import os.path
f = open(os.path.join(os.path.dirname(__file__),'templates','file1.txt'))
print f.read()
f.close()
Run Code Online (Sandbox Code Playgroud)

这也适用于打包版本。一个警告是,您还必须zip_safe = False在 setup.py 中进行设置,以便在安装过程中解压缩所有文件。

  • 请注意,您不需要使用 zip_safe=False。相反,使用 pkg_resources.resource_stream('packagename', 'templates/file1.txt').read() 并且 setuptools 将从文件系统或压缩蛋中为您获取流。 (9认同)
  • 该文档特别建议不要对打包数据使用 `__file__` 类型访问 (http://peak.telecommunity.com/DevCenter/setuptools#accessing-data-files-at-runtime)。使用 [Resource Management API](http://peak.telecommunity.com/DevCenter/PythonEggs#resource-management) 就像 OP 已经在使用的那样,就像 @JasonR.Coombs 建议的那样。 (5认同)