使用setuptools/distribute打包资源

11 投票
1 回答
11672 浏览
提问于 2025-04-15 15:59

我正在开发一个Python的包,这个包需要用到几个.txt文件(这些文件是用来生成其他文件的模板),但我在把这些文件复制到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

在setup.py文件中:

setup(
    [...]
    eager_resources = ['templates/file1.txt', 'templates/file2.txt']
)

在我的包里面:

from pkg_resources import resource_string
tpl = resource_string(__name__, 'templates/file1.txt')

...根据这些配置和文件结构,file1.txtfile2.txt应该能通过pkg_resources.resource_string来访问。但不幸的是,在执行setup.py install时,它们并没有被复制到site-packages。我漏掉了什么呢?

谢谢!

相关问题:

1 个回答

5

你可以在setuptools的文档中找到关于如何包含包数据的信息:https://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files

简单来说,你只需要在你的setup.py文件中设置 include_package_data=True。如果你使用的是subversion或CVS,所有版本控制的文件都会被包含进来。如果不是,你可以通过一个叫MANIFEST.in的文件来指定要包含哪些文件。

我相信distribute也支持这个功能。

这样一来,你就可以像平常一样访问这些文件,就好像它们没有被打包一样。比如在main.py中,你可以写:

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

这样在打包后的版本中也能正常工作。不过有一点需要注意的是,你还需要在setup.py中设置 zip_safe = False,这样在安装时所有文件才能被解压。

撰写回答