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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM