Python distribute到底使用package_data还是MANIFEST.in?

今天看Flask的文档,里面提到如何通过distribute发布你自己的Python包。讲包含文件的时候,提到要用MANIFEST.in并将include_package_data设置为True。

 

由于我自己也发布过几个包,当时并没有设置include_package_data,而且看lxyu的包setup.py里面设置的是package_data,所以就想搞清楚到底是怎么回事。

 

Google了一会,最终搞清楚了区别,记录在这里。

 

1、package_data

 

这个确实可以包含文件,但是实际上这是一个“lie”,也就是谎言。

 

为什么这么说呢?因为生成最终发布文件的时候有两种命令:

$ python setup.py bdist upload

$ python setup.py sdist upload

看到了吗?区别就是bdist和sdist。

 

bdist是发布二进制文件,sdist是发布源文件。

 

说package_data是谎言的原因就是,package_data只有在使用bdist时候才有用!也就是说如果你使用sdist的话是无法正确包含文件的!

 

更新:我搜到的这篇文章是2011年的,刚才搜了一下,Python2.7里面已经修正了这个问题,现在会自动把package_data里面的内容添加到MANIFEST文件中。所以实际上是间接使用了第二种方法。我个人觉得还是直接用MANIFEST.in比较好,更加统一。

 

2、MANIFEST.in

 

相比之下MANIFEST.in才是正确方法。MANIFEST.in无论在sdist还是bdist下都可以正常工作。

 

不过我还是有个疑问,就是include_package_data必须设置吗?

 

Flask文档中提到必须设置为True,否则MANIFEST.in不起作用。不过我自己发布包的时候并没有设置,还是可以用,所以猜测这个参数的默认值就是True。

 

保险起见,还是设置为True吧。

 

 

总结起来,正确包含文件的方式是:

  • 使用MANIFEST.in
  • 设置include_package_data=True

 

posted @ 2014-03-21 09:26  numbbbbb  阅读(...)  评论(... 编辑 收藏