在buildout环境中安装Python egg,包括数据文件

4

这个问题假设我想安装的Python软件包是一个包含模板和媒体文件的Django应用程序。但是这个问题适用于任何不仅包含.py文件的Python软件包。

我正在使用buildout创建一个可重建环境,在其中开发Django项目。我的buildout.cfg如下:

[buildout]
parts = python
eggs =
  normal-python-package
  python-package-with-data-files
find-files = 
  http://domain-to-python-package-with-data-files

[python]
recipe = zc.recipe.egg
interpreter = python
eggs = ${buildout:eggs}

(和一些Django相关的东西)。python-package-with-data-files可以通过页面http://domain-to-python-package-with-data-files上的链接获得。 normal-python-packagepython-package-with-data-files两个包已经成功安装在eggs/目录下。因为python-package-with-data-files在其setup.py文件中将zip_safe设置为False,所以它在eggs/中是未压缩的状态。
只有python-package-with-data-files的非.py文件在未压缩的egg中不可用(这些文件包含在.tar.gz包中,可从http://domain-to-python-package-with-data-files获取)。
如何使这些数据文件包含在egg中?我需要更改包的setup.py文件吗?还是与buildout有关?
我发现的情况如下:
如果我在python-package-with-data-files根目录中运行python setup.py sdist,则所有数据文件都包含在创建的.tar.gz文件中。但是如果我运行python setup.py bdist,则构建结果不包括数据文件。
这让我觉得问题并非特定于buildout。但也许有一种方法可以告诉buildout不要进行bdist,而是进行sdist以创建egg并将包安装到项目中。
我该怎么办?我是python-package-with-data-files的维护者,因此如果需要,我可以更改setup.py

经过更多的研究,我找到了最终的解决方案:使用一个MANIFEST.in文件,并在我的setup.py中使用include_package_data = True。我之前尝试过这个方法,但认为它不影响媒体文件。问题出在sdistbdist命令使用了来自package….egg-info/目录的缓存版本的文件列表。所以在运行sdistbdist之前删除此目录非常重要。感谢Carl Meyer鼓励我继续我的旅程 :-) - Gregor Müllegger
1个回答

3
看起来您需要在您的setup.py文件中使用package_data关键字参数,这样distutils就知道这些文件应该随您的软件包一起安装。请参考这里的文档。

1
我已经尝试过这个,但仍然没有添加数据文件。在你在这里提到它之后,我又尝试了一次,现在它可以工作了。我发现使用相对于包的路径而不是相对于项目根目录的路径很重要。非常感谢!现在它可以工作了。 - Gregor Müllegger
谢谢@GregorMüllegger,我没有注意到它们是相对于包而不是项目根目录/setup.py!花了我很长时间。 - Andy Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接