標籤:

Python打包時添加非代碼文件的坑

Title: Python打包時添加非代碼文件的坑 Tags: python, 小結

對於 Python 的打包, 通常有兩種, 一種是對源文件打包, 一種是安裝包, 既在上傳 pypi 的時候一般會執行

python3 setup.py sdist bdist_wheel

使用pip安裝的時候一般是安裝bdist打包出來的文件。

關於在打包中加入非程序文件, 有幾種方法, 一種是在 MANIFEST.in 中加入, 對於 setup.py 中也提供了package_data參數, 另外對於 setuptools 還提供了特別的 include_package_data的參數, 接下來介紹這些參數的意義和怎麼用。

MANIFEST.in

MANIFEST.in文件是針對 源文件打包 的, 當需要把非程序文件, 包括README, css或者test文件等加入時, 在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 MANIFEST.in file. For more information, see the section below on Including Data Files.

設為 True 時, 打包時setuptools 會自動加入在 MANIFEST.in中指定的文件。

原本是 MANIFEST 在 setup.py 中的package_data尋找額外的文件的, 現在變成大家以 MANIFEST.in 為準了。

這會發生什麼事情呢, 如果你同時用了include_package_data和package_data, 那麼你的 sdist 就會瞬間爆炸。

bdist 打包出來的東西會包含package_data中的內容, 但是源代碼打包的時候就會失去在package_data中指明的文件。

總結

永遠也不要用include_package_data

MANIFEST.in 用來給源文件打包, 裡面包含許多額外的信息, 比如測試文件之類的。

package_data用於指定安裝時加入的額外的文件, 不需要再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

TAG:Python | pypi | 總結 |