Python 虛擬環(huán)境讓不同的項(xiàng)目在相互獨(dú)立的 Python 運(yùn)行環(huán)境里運(yùn)行,從而讓各項(xiàng)目的依賴庫相互獨(dú)立,避免在使用不同版本的支持庫而導(dǎo)致沖突。
當(dāng)創(chuàng)建新的 Python 項(xiàng)目時(shí),最好先創(chuàng)建一個(gè)新的虛擬環(huán)境,并在這個(gè)虛擬環(huán)境中安裝 Python 支持庫。
在虛擬環(huán)境中,可以隨意安裝、升級(jí)或卸載 Python 支持庫,不會(huì)影響其他項(xiàng)目的虛擬環(huán)境。
此外,使用虛擬環(huán)境,還有利于項(xiàng)目的移植與復(fù)用。
本文將介紹 11 款常用的 Python 虛擬環(huán)境管理器。
1. venv
venv 是內(nèi)置 Python 標(biāo)準(zhǔn)庫中用于創(chuàng)建輕量級(jí)虛擬環(huán)境的工具。
venv 的功能簡單,無需單獨(dú)安裝,適合初學(xué)者使用,但如果你需要更強(qiáng)大好用的虛擬環(huán)境管理器,請繼續(xù)往下看。

2. virtualenv
virtualenv 是用于創(chuàng)建 Python 虛擬環(huán)境的工具。自 Python 3.3 起,其部分功能已經(jīng)整合到標(biāo)準(zhǔn)庫中的 venv 模塊中,但 virtualenv 仍然保留了其特有的優(yōu)勢。
相較于 venv,virtualenv 利用了 app-data seed 方法,創(chuàng)建虛擬環(huán)境的速度更快。
此外,virtualenv 提供了更多的擴(kuò)展和定制選項(xiàng),能夠靈活地創(chuàng)建多種 Python 版本的虛擬環(huán)境,并且可以通過 pip 快速升級(jí)。

3. Pipenv
Pipenv 是有效地彌合了 pip、python 和 virtualenv 之間的差距。
使用 Pipfile 和 Pipfile.lock 文件,Pipenv 可以方便地指定 Python 版本和支持庫,并與 pyenv 進(jìn)行交互操作,生成構(gòu)建項(xiàng)目鎖定文件。
Pipenv 自動(dòng)為項(xiàng)目創(chuàng)建虛擬環(huán)境,在安裝/卸載支持庫時(shí)根據(jù)需要更新 Pipfile。
Pipenv 的主要目標(biāo)是為項(xiàng)目開發(fā)者和用戶提供一致的工作環(huán)境,不再需要分別使用 pip 和 virtualenv。
使用 Pipfile 和 Pipfile.lock 分離抽象支持庫聲明和測試過的支持組合。
通過 Pipfile.lock 文件中的哈希值進(jìn)行安全驗(yàn)證。
強(qiáng)烈推薦使用最新版本的支持庫降低安全風(fēng)險(xiǎn)。

4. pyenv
Pyenv 讓開發(fā)者可以在多個(gè) Python 版本之間輕松切換,解決了 venv 不能創(chuàng)建不同 Python 版本虛擬環(huán)境的限制。
Pyenv 支持在不同項(xiàng)目中切換 Python 版本,解決了同一操作系統(tǒng)中不同項(xiàng)目對 Python 版本需求不同的問題。
開發(fā)者有時(shí)會(huì)濫用 pyenv 設(shè)置全局的 Python 版本,導(dǎo)致項(xiàng)目之間的 Python 版本混亂,影響項(xiàng)目的復(fù)用和開發(fā)環(huán)境的穩(wěn)定。
Pyenv 的設(shè)計(jì)理念很簡單,秉承了 UNIX 哲學(xué)中單一用途工具的傳統(tǒng),它源自于 rbenv 和 ruby-build,并專門為 Python 進(jìn)行了修改和適配。
與其它同類工具不同,pyenv 完全由純 Shell 腳本實(shí)現(xiàn),不依賴 Python,無需擔(dān)心 Python 引導(dǎo)問題。
Pyenv 通過修改操作系統(tǒng)的 PATH 環(huán)境變量,實(shí)現(xiàn)在不同 Python 版本之間的切換,并能同時(shí)運(yùn)行多個(gè) Python 版本的命令,在不同 Python 環(huán)境下進(jìn)行測試和開發(fā)時(shí)特別實(shí)用。
盡管 pyenv 主要用于切換 Python 版本,它本身并不直接管理虛擬環(huán)境。不過,可以結(jié)合 pyenv 與 virtualenv 命令創(chuàng)建和管理虛擬環(huán)境,或者使用 pyenv-virtualenv 插件。
pyenv 目前已經(jīng)成為 Python 開發(fā)者創(chuàng)建虛擬環(huán)境的首選工具之一。

5. Conda
Conda 是由 Anaconda 公司出品的命令行工具,用于在 Windows、macOS 和 Linux 上進(jìn)行虛擬環(huán)境管理。
它不僅能管理 Python 包,還能處理非 Python 支持庫,尤其針對數(shù)據(jù)科學(xué)方面的開發(fā)進(jìn)行了優(yōu)化。
Conda 使用自己的 Conda 虛擬環(huán)境切換非 Python 依賴項(xiàng),無需使用復(fù)雜的 Docker。
與 Poetry 類似,Conda 在構(gòu)建環(huán)境時(shí)執(zhí)行完整的支持庫解析,其支持庫解析器 libmamba 是用 C++ 實(shí)現(xiàn)的,速度更快。
Conda 受到了廣大數(shù)據(jù)科學(xué)開發(fā)人員的歡迎,但其用戶體驗(yàn)仍有改進(jìn)空間。
用戶在與項(xiàng)目文件夾無關(guān)的 Conda 虛擬環(huán)境中操作,且支持庫和配置跟蹤可能會(huì)面臨一定挑戰(zhàn)。
盡管如此,Conda 仍是 Python 生態(tài)系統(tǒng)中使用最廣泛的工具之一,尤其是在與 Ray 和 Metaflow 等第三方工具集成時(shí)。

6. Poetry
Poetry 支持安裝和更新項(xiàng)目依賴支持庫,提供鎖文件以確保項(xiàng)目的復(fù)用,并能構(gòu)建項(xiàng)目分發(fā)包。
Poetry 要求 Python 3.8+,跨平臺(tái)支持 Linux、macOS 和 Windows。
Poetry 類似于 Cargo(Rust 的包管理器) 和 npm(Node.js 的包管理器),是 Python 生態(tài)系統(tǒng)中使用體驗(yàn)與這兩個(gè)包最接近的工具。
類似于 Conda,Poetry 會(huì)預(yù)先解析完整的依賴圖,并按拓?fù)漤樞虬惭b依賴。
Poetry 依據(jù) pyproject.toml 管理項(xiàng)目內(nèi)外的虛擬環(huán)境。
poetry.lock 文件確保項(xiàng)目的復(fù)用,但體積較大。
此外,Poetry 還兼具構(gòu)建工具功能,可發(fā)布 Python 包。
Poetry 的依賴解析速度較慢,部分是因?yàn)?Python 包聲明支持庫的方式不一致,可能會(huì)導(dǎo)致解析支持庫解析的時(shí)間較長。

7. PDM
PDM 的目標(biāo)是成為新一代 Python 支持庫管理工具。
與 Poetry 類似,PDM 也是一款簡單而快速的依賴解析器,主要適用于大型二進(jìn)制分發(fā)。
它支持 PEP 517 的構(gòu)建后端和 PEP 621 的項(xiàng)目元數(shù)據(jù),具備靈活強(qiáng)大的插件系統(tǒng)和多功能用戶腳本。
此外,PDM 還可以使用 indygreg 的 python-build-standalone 安裝 Python,并支持類似 pnpm 的集中式安裝緩存。
與 Poetry 的主要區(qū)別在于,PDM 支持 PEP-582,將項(xiàng)目的虛擬環(huán)境集成到項(xiàng)目目錄中,避免了傳統(tǒng)虛擬環(huán)境的手動(dòng)激活和停用,提升了開發(fā)效率。

8. Huak
Huak 是使用 Rust 開發(fā)的 Python 包管理器。JavaScript 社區(qū)中出現(xiàn)了向 Rust 轉(zhuǎn)型的趨勢,Huak 也希望將 Rust 引入 Python 的生態(tài)系統(tǒng)。
Rust 生態(tài)系統(tǒng)有著出色的上手體驗(yàn),Cargo 起了很大的作用。
Huak 希望為 Python 提供相同的體驗(yàn),它的目標(biāo)是要達(dá)到極致速度。
Huak 的設(shè)計(jì)理念旨在提升開發(fā)者體驗(yàn),使其在開發(fā) Python 項(xiàng)目時(shí)能夠享受到與 Cargo 類似的流暢和高效。
雖然目前 Huak 仍處于實(shí)驗(yàn)階段,但其未來潛力巨大,值得關(guān)注。

9. Pixi
Pixi 是基于 Rust 的 rattler 庫開發(fā)的,具有顯著的性能和安全優(yōu)勢。
它的設(shè)計(jì)理念是提供類似于 cargo 或 yarn 的用戶體驗(yàn),但適用于所有語言。
Pixi 目標(biāo)是直接取代 Conda,并能像 Conda 一樣管理非 Python 依賴項(xiàng)。
2024 年 2 月,為了追求更快的速度,Pixi 將后臺(tái)的 rip 轉(zhuǎn)向 uv。
與 Conda 和 mamba 不同,Pixi 提供了自定義類型的鎖文件,使其在復(fù)用方面領(lǐng)先于 Conda。
Pixi 支持可復(fù)用的方式安裝支持庫,并支持 Python、C++ 和 R 等多種語言, 且兼容所有主流操作系統(tǒng)。
在提供高效且一致的用戶體驗(yàn)的同時(shí),Pixi 還提供了簡潔而強(qiáng)大的命令行界面,使得支持庫管理更加簡單、高效。

10. Rye
Rye 由 Astral.sh 公司維護(hù)和開發(fā),也是基于 Rust 構(gòu)建的,旨在提升開發(fā)效率和用戶體驗(yàn)。
與傳統(tǒng)的包管理工具相比,Rye 的性能有顯著提升,功能也更加豐富。
Rye 希望為 Python 開發(fā)者提供一站式的工具,讓 Python 支持庫的安裝與管理更加輕松。
Rye 使用與 uv 相同的支持庫解析器,提供更快的管理體驗(yàn)。
Rye 還提供了與 poetry 類似的功能,但速度更快。
OpenAI 的 Python API 庫。,未來可能與 uv 項(xiàng)目合并,進(jìn)一步增強(qiáng)其功能。
通過使用與 uv 相同的依賴解析器,Rye 能夠提供更快的依賴管理體驗(yàn)。
隨著 uv 功能的不斷增強(qiáng),將來這兩個(gè)項(xiàng)目有可能會(huì)進(jìn)行合并。

11. uv
uv 也是 Astral.sh 公司出品的 Python 虛擬環(huán)境管理器,它是當(dāng)前備受期待的新生代包管理工具。
uv 的目標(biāo)是成為 pip 的替代品,同時(shí)具備與 Cargo 類似的功能。
uv 支持 Python 打包工具的所有特性,包括可編輯安裝、Git 依賴、URL 依賴、本地依賴、約束文件和源碼分發(fā)等。
Astral.sh 公司還開發(fā)了 Rust 生態(tài)中備受開發(fā)者喜愛的 ruff (用 Rust 開發(fā)的高性能 Python 代碼檢查和代碼格式化工具)。
與 poetry 類似,uv 通過 pyproject.toml 管理項(xiàng)目,但得益于 Rust 的高效算法,其依賴解析速度至少比 poetry 快一個(gè)量級(jí)。
目前,uv 還沒有推出穩(wěn)定版,但其性能測試結(jié)果讓人期待。

uv 在性能方面表現(xiàn)優(yōu)異,相較于 pip 和 pip-tools,在沒有緩存時(shí)快 8~10 倍,在有緩存時(shí)快 80~115 倍。
uv 創(chuàng)建虛擬環(huán)境的速度比 venv 快 80 倍,比 virtualenv 快 7 倍,并且不依賴于 Python。
總之,uv 作為高效且兼容性強(qiáng)的包管理工具,有望取代 poetry 等工具。
