跳到主要內容

conda-forge 上 Python 套件的 Noarch 變體套件

·4 分鐘閱讀
Isuru Fernando
conda-forge/core 成員

我們為 conda-forge 上具有編譯擴充功能但具有純 Python 參考實作的 Python 套件引入了 noarch 變體,以便讓新 Python 變體的早期採用者更輕鬆。

conda-forge 套件一直以來都是完整包含所有組件的。當一個套件預設關閉某些建置選項以減少依賴性時,我們會啟用這些選項,為使用者提供最多的功能和效能。

在 Python 世界中,有些套件是用 C/C++/Cython 編寫的,以充分發揮套件的效能。然而,這些套件有時會有用 Python 編寫的參考實作。Python 參考實作是用於檢查 C/C++/Cython 程式碼對照更簡單的 Python 實作的好方法,並且對於像 PyPy 這樣的平台也很有用,在這些平台上,由於 PyPy 模擬 Python C/C++ API,C/C++/Cython 實作可能比 Python 參考實作慢。例如,對於 Cython 套件,在建置 Cython wheel 本身時設定 CYTHON_NO_COMPILE 環境變數,它將使用 Python 參考實作。判斷套件是否具有 Python 參考實作的唯一方法是查看程式庫的原始程式碼,以查看 extensions 是否為可選。

為了支援像 PyPy 這樣的平台,某些套件會針對已知使用編譯擴充功能效能更高的平台建置具有編譯擴充功能的 wheel,但也為其他平台提供通用的純 Python wheel。這也為新的 Python 版本和變體(如 free-threading Python 建置)提供了一種讓這些 Python 版本的早期採用者使用這些套件的方式。

在 conda-forge 上,我們通常有編譯過的 Python 套件,但不提供參考實作。這意味著新 Python 版本的早期採用者需要等待由 @conda-forge/bot 團隊管理的 conda-forge 機器人啟動遷移並重建套件。例如,free-threading Python 3.13 建置仍然暫停,因為 conda-forge 已決定優先關注預設(啟用 GIL)Python 3.13 建置,同時上游套件致力於支援 free-threading。另一個問題是,某些套件在建置或測試時具有循環依賴性,這需要一些手動處理。

我們一直在為某些 feedstock 新增 noarch: python 變體,以便編譯的擴充功能具有更高的優先順序,而純 Python 擴充功能具有較低的優先順序,這使得 conda solver 在沒有可用的合適編譯變體時使用 noarch: python 變體。一個問題是 linter 可能不喜歡 noarch 配方上的選擇器。我們新增了一個選項

linter:
skip:
- lint_noarch_selectors

conda-forge.yml,這將使 linter 跳過此警告/錯誤。

我們使用具有以下內容的 recipe/conda_build_config.yaml 建置這兩個變體,

use_noarch:
- true # [linux64]
- false

然後在 recipe/meta.yaml 中,我們進行以下更改

build:
noarch: python # [use_noarch]
track_features: # [use_noarch]
- pyyaml_no_compile # [use_noarch]

requirements:
build:
- {{ compiler('c') }}
- {{ stdlib("c") }}
host:
- python # [not use_noarch]
- python {{ python_min }}.* # [use_noarch]
- setuptools
- pip
run:
- python # [not use_noarch]
- python >={{ python_min }}.* # [use_noarch]
- yaml

test:
requires:
- pip
- python {{ python_min }}.* # [use_noarch]

最後,在建置腳本中,我們使用環境變數 use_noarch 來設定一個選項,以強制擴充功能為純 Python。在 pyyaml 的情況下,我們可以透過設定環境變數 PYYAML_NO_LIBYAML 來強制執行。recipe/build.sh 可能看起來像,

if [[ "$use_noarch" == "true" ]]; then
export PYYAML_NO_LIBYAML=1
fi
$PYTHON -m pip install .

我們在此列出一些 PR,作為想要實驗的 conda-forge 維護者的參考。