出自 Arch Linux 中文维基

Tango-preferences-desktop-locale.png本文或本節需要翻譯。要貢獻翻譯,請訪問簡體中文翻譯團隊Tango-preferences-desktop-locale.png

附註: Many changes have happened on the English page since last translation.(在 Talk:Python 打包準則# 中討論)
Arch 打包準則

32 位CLRCMakeCrossDKMSEclipseElectronFontFree PascalGNOMEGoHaskellJavaKDEKernelLispMesonMinGWNode.jsNonfreeOCamlPerlPHPPythonRRubyRustVCSWebWine

本文檔描述了如何基於標準 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 包裝機制已從 distutilssetuptools 遷移, 後者目前正處於活躍開發時期並且能直接在 setup.py 文件中替換前者。不過主要的區別在於,setuptools 並沒有和 Python 主包打在一起,因此你必須將其指定為 makedepends

如果成品包中存在導入 (import) 了 pkg_resources 模塊 的二進位, 那麼 setuptools 必須在分包函數 package_*() 中另外指定為 depends; 還有, 如果 PKGBUILD 只安裝一個版本的 Python 包的話, setuptools 需要從 makedepends 移至 depends

pip

如果你需要使用 pip (由 python-pippython2-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-installedhttps://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

注意事項

絕大部分情況下, 你應該設置 archany ,因為絕大部分 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