Python打包時添加非代碼文件的坑
Title: Python打包時添加非代碼文件的坑 Tags: python, 小結
對於 Python 的打包, 通常有兩種, 一種是對源文件打包, 一種是安裝包, 既在上傳 pypi 的時候一般會執行
python3 setup.py sdist bdist_wheel
使用pip安裝的時候一般是安裝bdist打包出來的文件。
關於在打包中加入非程序文件, 有幾種方法, 一種是在 http://MANIFEST.in 中加入, 對於 setup.py 中也提供了package_data參數, 另外對於 setuptools 還提供了特別的 include_package_data的參數, 接下來介紹這些參數的意義和怎麼用。
http://MANIFEST.in
http://MANIFEST.in文件是針對 源文件打包 的, 當需要把非程序文件, 包括README, css或者test文件等加入時, 在http://MANIFEST.in中指定, 用於生成MANIFEST
MIANIFEST會暗中自動尋找以下的文件:
- 所有py_modules 和 packages中沒有明確說明的python文件
- ext_modules 或 libraries選項中指明的C文件
- scripts指明的文件
- 所有看上去像是test文件的, 比如tests/*.py
- README.txt 或者 README, setup.py, setup.cfg
- package_data中指明的文件
- data_files中指明的文件
package_data
package_data是在setup.py中的參數, 用於控制安裝包裡面包含的文件。
應該這樣理解, MANIFEST 控制 sdist 包含的內容, package_data控制bdist包含的內容。
一般情況是, 對源文件打包裡面一般包含README, tests這些, 但是對於安裝包這不需要。 所以分開設置。
include_package_data
坑就是指include_package_data, 這個參數是setuptools特有的, 但是非常容易讓人誤解然後勿用。 setuptools的文檔中是這樣寫的
If set to True, this tells setuptools to automatically include any data files it finds inside your package directories that are specified by your http://MANIFEST.in file. For more information, see the section below on Including Data Files.
設為 True 時, 打包時setuptools 會自動加入在 http://MANIFEST.in中指定的文件。
原本是 MANIFEST 在 setup.py 中的package_data尋找額外的文件的, 現在變成大家以 http://MANIFEST.in 為準了。
這會發生什麼事情呢, 如果你同時用了include_package_data和package_data, 那麼你的 sdist 就會瞬間爆炸。
bdist 打包出來的東西會包含package_data中的內容, 但是源代碼打包的時候就會失去在package_data中指明的文件。總結
永遠也不要用include_package_data
http://MANIFEST.in 用來給源文件打包, 裡面包含許多額外的信息, 比如測試文件之類的。
package_data用於指定安裝時加入的額外的文件, 不需要再http://MANIFEST.in中重複定義, 源文件打包的時候回自動包含這裡面的文件。
參考:
- specifying-the-files-to-distribute
- setuptools
2016年12月12日01:04:25
推薦閱讀:
※如何將自己的程序發布到 PyPI
※Install a package from Github that has other github dependencies