Python的distutils不包含data_files。

19

我是distutils的新手。我正在尝试将一些数据文件与包一起包含。这是我的代码:

from distutils.core import setup

setup(name='Scrapper',
      version='1.0',
      description='Scrapper',      
      packages=['app', 'db', 'model', 'util'],
      data_files=[('app', ['app/scrapper.db'])]      
     )

执行 python setup.py sdist 后创建的 zip 文件不包含 scrapper.db 文件。我在应用程序目录中有 scrapper.db 文件。

谢谢帮助。


2
一个与你问题无关的备注:我建议你使用一个顶级包名称,例如 scrapper,而不是使用四个非常常用的名称来命名四个包。 - merwok
你使用的是哪个Python版本? - Omer Dagan
2个回答

21

你可能需要添加一个包含内容为"include app/scrapper.db"MANIFEST.in文件。

这是由于distutils中的一个bug导致的:任何在data_filespackage_data中的内容都应该自动包含在生成的MANIFEST中。但在Python 2.6及更早版本中,它不会自动包含,因此您必须把它包含在MANIFEST.in中。

这个bug在Python 2.7中已修复。


3
我仍然在使用Python 2.7.1+时遇到同样的问题。我找到了这个错误报告,但我不明白为什么状态是committed/rejected。请问有没有解决办法,而不必回退到使用MANIFEST.in?谢谢! - mac
1
提交/拒绝状态用于已修复的错误。 - merwok

1

尝试删除MANIFEST文件,这样distutils将被强制重新生成它。

注意:我一直在使用Python 3.x,所以我不知道这是否适用于2.x。


你误解了我的回答。我不建议创建一个MANIFEST文件。我是在谈论“MANIFEST.in”,即清单模板文件。这允许您“添加”到自动生成的清单中的内容。由于distutils中存在一个错误,直到Python 2.6版本(包括Python 2.6)的所有版本中,data_files和package_data条目都不会被包含在自动生成的清单中,除非您将它们添加到MANIFEST.in文件中。 - Carl Meyer
@Carl Meyer 我并没有评论你说或没说的话。我只是想引用一个更详细地讨论那部分内容的答案(这不是我的重点)。而且我通常使用 MANIFEST;我可能应该写成 MANIFEST.in(我已经改过了)。如果我误传了你的答案,抱歉。 - Matthew
很遗憾,您编辑后的答案现在是错误的:/ 不管您是否提供MANIFEST.in,distutils都会为您生成一个MANIFEST。MANIFEST.in允许您向生成的MANIFEST文件添加内容。 - Carl Meyer
@Carl Meyer 好的,我已经删除了所有与我试图传达的内容无关的垃圾。希望我没有搞砸其他什么东西。谢谢。 - Matthew

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