32 位 – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – Web – Wine
本文檔描述了如何基於標準 PKGBUILD 來為 Python 程序進行打包。
包命名
Python 3 的包應該使用 python-modulename
進行命名。如果軟體包與 Python 某個生態系統(例如 pip 或 tox) 關係密切,請添加相應前綴。對於其他 Python 程序來說, 使用程序名就足夠了。無論如何, 包的名字應該完全使用小寫。
這同樣適用於 Python 2,只需要修改前綴為 python2-
(如果必須)。
帶版本的軟體包
如果你需要添加一個帶版本的軟體包,請使用這種格式: python-模塊名-版本
, 比如 python-colorama-0.2.5
。這樣,Python 的依賴colorama==0.2.5
就會成為名為 python-colorama-0.2.5
的 Arch 軟體包。
安裝方式
Python 的包通常使用 Python 語言自帶的工具來安裝, 例如 pip 或者 easy_install[失效連結 2021-05-17 ⓘ], 這些工具就像是能從在線源 (通常是 PyPI, Python 包索引 (Python Package Index) ) 獲取源文件的軟體包管理器一樣,而且還能跟蹤相關的文件狀態。 (如需這兩個工具的詳細比較,請參見 pip vs easy_install).
然而,如果要想使用 PKGBUILD 文件來幫助安裝 Python 軟體包的話,標準化的 distutils 可以說是最方便的了。它會使用已下載源碼包裡面的 setup.py
接著就能很輕鬆地將文件安裝到 $pkgdir/usr/lib/python<python 版本>/site-packages/$pkgname
這個文件夾下面了。
distutils
這裡有一個 distutils PKGBUILD 樣本。他遵從下面的格式:
<python 版本> setup.py install --root="$pkgdir/" --optimize=1
其中:
- 根據程序所使用的 Python 版本來使用
python
或者python2
替換 <python 版本> 。 -
--root="$pkgdir/"
選項是為了防止文件直接安裝到主系統而不是打包目錄中。如果直接安裝到主系統中,會產生權限錯誤。 -
--optimize=1
選項是用來編譯生成.pyo
文件,好讓 pacman 更好的跟蹤優化她們。
setuptools
Python 包裝機制已從 distutils 向 setuptools 遷移, 後者目前正處於活躍開發時期並且能直接在 setup.py
文件中替換前者。不過主要的區別在於,setuptools 並沒有和 Python 主包打在一起,因此你必須將其指定為 makedepends
。
如果成品包中存在導入 (import) 了 pkg_resources
模塊 的二進位, 那麼 setuptools 必須在分包函數 package_*()
中另外指定為 depends
; 還有, 如果 PKGBUILD 只安裝一個版本的 Python 包的話, setuptools 需要從 makedepends
移至 depends
。
pip
如果你需要使用 pip (由 python-pip包 和 python2-pipAUR 提供), 例如 為了安裝 wheel[失效連結 2021-05-17 ⓘ] 的Python包, 請記得傳入下列參數:
PIP_CONFIG_FILE=/dev/null pip install --isolated --root="$pkgdir" --ignore-installed --no-deps *.whl
-
PIP_CONFIG_FILE=/dev/null
此參數會使 pip 忽略{/etc,~/.config}/pip.conf
因為這個配置文件可能會向 pip 添加一些額外參數。 -
--isolated
此參數會使 pip 忽略環境變量 (以及{/etc,~/.config}/pip/pip.conf
) 否則 pip 又會被添加一些額外參數。 -
--ignore-installed
在 https://github.com/pypa/pip/issues/3063 處提出的問題解決之前,把這個參數加上吧 (不然的話 pip 會在有早期--user
安裝痕跡的情況下跳過安裝). -
--no-deps
此參數能確保依賴不會跟著一起被打進主包裡面去。
pip 不知道如何生成 .pyo
文件 (see https://github.com/pypa/pip/issues/2209). 為了生成 .pyo
文件,在使用 pip 安裝後, 運行:
python -O -m compileall "${pkgdir}/path/to/module
注意事項
絕大部分情況下, 你應該設置 arch
為 any
,因為絕大部分 Python 包是平台無關的。
請不要將文件安裝到類似於 tests
這樣名字的目錄中, 因為這很容易與其他 Python 包發生文件衝突 (比方說, /usr/lib/python2.7/site-packages/tests/
).
PyPI 下載 URLs
PyPI 中像是這種格式 https://pypi.python.org/packages/source/${_name:0:1}/${_name}/${_name}-${pkgver}.tar.gz
<footnote> 的 URL 已經在 2016 年靜默失效了, 而新的格式需要一種只有從 PyPI 網站才能取得的不可預測的哈希碼[1][失效連結 2021-05-17 ⓘ]。
在下游維護者向 PyPI 維護者抱怨了這個問題 [2][失效連結 2021-05-17 ⓘ] 之後, 一種新的穩定的格式出現了 [3][失效連結 2021-05-17 ⓘ]: PKGBUILD#source source=()
數值現在需要使用如下 URL 模板:
請注意,我們使用了自定義的 $_name
而不是 $pkgname
,因為 Python 包通常都命名成這樣: python-$_name
。
- 源碼包
https://files.pythonhosted.org/packages/source/${_name::1}/${_name}/${_name}-${pkgver}.tar.gz
- 雙版本 wheel 包 (Python 2 和 Python 3 都兼容)
https://files.pythonhosted.org/packages/py2.py3/${_name::1}/$_name/$_name-$pkgver-$_name-$pkgver-py2.py3-none-any.whl
- 特定架構的 wheel 包
- 對於特定架構的 wheel 包,可以使用
source_x86_64=('...')
來表示 x86_64 架構的下載地址。與此同時可以使用_py=py36
來避免重複書寫 Python 版本: https://files.pythonhosted.org/packages/$_py/${_name::1}/$_name/$_name-$pkgver-$_py-${_py}m-manylinux1_x86_64.whl