欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中依賴管理工具使用終極指南(保姆級(jí)教程)

 更新時(shí)間:2025年07月30日 09:25:40   作者:荔枝吻  
在 Python 開發(fā)中,虛擬環(huán)境和包管理工具是必不可少的,由于Python的庫(kù)發(fā)展的非常快,工具也是日新月異,搜索會(huì)發(fā)現(xiàn)有pip,venv、Virtualenv、Conda、Pipenv、Poetry、UV等等,下面小編就來(lái)和大家詳細(xì)講講它們的具體使用吧

前言

在 Python 開發(fā)中,虛擬環(huán)境和包管理工具是必不可少的。它們可以幫助我們更好地管理項(xiàng)目依賴,避免環(huán)境沖突,提高開發(fā)效率。但是依賴管理堪稱“頭號(hào)工程難題”——環(huán)境沖突、版本不一致、部署失敗等問(wèn)題層出不窮。

由于Python的庫(kù)發(fā)展的非??欤ぞ咭彩侨招略庐?,搜索會(huì)發(fā)現(xiàn)有pip,venv、Virtualenv、Conda、Pipenv、Poetry、UV等等,你是否能把它們完全分清楚?
本文全面梳理解析截至目前的所有主流依賴工具,并分類介紹,涵蓋基礎(chǔ)工具、現(xiàn)代解決方案與新興神器,助你精準(zhǔn)選擇最適合項(xiàng)目的武器庫(kù)!

在深入對(duì)比之前,我們先明確虛擬環(huán)境和包管理工具的核心作用:

  • 包管理:管理項(xiàng)目的依賴包,包括安裝、更新、卸載等操作,并確保依賴關(guān)系的一致性。
  • 虛擬環(huán)境:為每個(gè)項(xiàng)目創(chuàng)建一個(gè)獨(dú)立的Python運(yùn)行環(huán)境,隔離依賴,避免不同項(xiàng)目之間的包版本沖突。

一、包管理工具

pip(Python官方,2008)

pip GitHub

定位:Python包安裝核心引擎,最基本也是最廣泛使用的 Python 包安裝工具,所有工具底層依賴 ,從PyPI安裝庫(kù),由PyPA組織維護(hù)。

PyPA:指 Python Packaging Authority,一個(gè)維護(hù) Python 打包相關(guān)項(xiàng)目的小組,包括 pip、packaging、setuptools、wheel、twine、build 等,相關(guān)項(xiàng)目具體見(jiàn) https://github.com/pypa。

優(yōu)點(diǎn):無(wú)需安裝,pip install 即用,支持PyPI源定制。

缺點(diǎn):無(wú)依賴沖突解決能力,無(wú)環(huán)境隔離功能

場(chǎng)景:臨時(shí)腳本安裝包,其他工具的底層引擎

二、虛擬環(huán)境工具

1. virtualenv(Ian Bicking,2007)

virtualenv GitHub

舊時(shí)代的產(chǎn)物,除非還在使用python 2。

  • 定位:第三方虛擬環(huán)境工具(支持Python 2/3)
  • 功能:創(chuàng)建隔離環(huán)境,支持指定不同 Python 解釋器。依賴 pip 管理包。
  • 優(yōu)點(diǎn):支持舊版 Python(如 Python 2)??芍付ㄈ我釶ython解釋器,支持--system-site-packages復(fù)用系統(tǒng)包 。
  • 缺點(diǎn):需額外安裝,Windows兼容性較弱 。依賴管理需手動(dòng)處理。無(wú)自動(dòng)依賴解析。
  • 場(chǎng)景:遺留Python 2項(xiàng)目維護(hù),多解釋器版本測(cè)試。
# 安裝virtualenv   
pip install virtualenv      
# 創(chuàng)建虛擬環(huán)境   
virtualenv myenv      
# 激活虛擬環(huán)境   
# Windows   
myenv\Scripts\activate   
# macOS/Linux   
source myenv/bin/activate      
# 退出虛擬環(huán)境   
deactivate

2. venv(Python3.3,2012)

python自帶的虛擬環(huán)境管理,簡(jiǎn)單是它的優(yōu)勢(shì),也是它的劣勢(shì)。

只能創(chuàng)建虛擬環(huán)境,不能指定系統(tǒng)不存在的python環(huán)境版本,不能管理系統(tǒng)中的環(huán)境列表(例如選擇一個(gè)已經(jīng)創(chuàng)建好了的虛擬環(huán)境)。

venv的虛擬環(huán)境默認(rèn)是存放在項(xiàng)目文件夾里的,這會(huì)影響項(xiàng)目文件的管理。

  • 定位:Python 3.3+內(nèi)置的輕量級(jí)環(huán)境隔離
  • 功能:創(chuàng)建隔離的 Python 環(huán)境,依賴 pip 手動(dòng)管理包。
  • 優(yōu)點(diǎn):開箱即用,無(wú)額外依賴,目錄結(jié)構(gòu)清晰。兼容性好,與"pip"無(wú)縫集成。
  • 缺點(diǎn):無(wú)依賴解析能力,需手動(dòng)維護(hù) requirements.txt。無(wú)法創(chuàng)建非系統(tǒng)Python版本環(huán)境 ,不支持多 Python 版本切換。
  • 場(chǎng)景:快速驗(yàn)證代碼或小型項(xiàng)目。如果你只需要基本的虛擬環(huán)境功能,"venv"是最輕量、最直接的選擇。
# 創(chuàng)建虛擬環(huán)境   
python -m venv myenv      
# 激活虛擬環(huán)境   
# Windows   
myenv\Scripts\activate   
# macOS/Linux   
source myenv/bin/activate      
# 退出虛擬環(huán)境   
deactivate

三、版本管理工具

pyenv(社區(qū)開發(fā),2014)

pyenv GitHub

Pyenv 讓開發(fā)者可以在多個(gè) Python 版本之間輕松切換,解決了 venv 不能創(chuàng)建不同 Python 版本虛擬環(huán)境的限制。

Pyenv 支持在不同項(xiàng)目中切換 Python 版本。

但是,開發(fā)者有時(shí)會(huì)濫用 pyenv 設(shè)置全局的 Python 版本,導(dǎo)致項(xiàng)目之間的 Python 版本混亂,影響項(xiàng)目的復(fù)用和開發(fā)環(huán)境的穩(wěn)定。

Pyenv 的理念很簡(jiǎn)單,秉承了 UNIX 哲學(xué)中單一用途工具的傳統(tǒng),它源自于 rbenv 和 ruby-build,并專門為 Python 進(jìn)行了修改和適配。
與同類工具不同,pyenv 完全由純 Shell 腳本實(shí)現(xiàn),不依賴 Python,無(wú)需擔(dān)心 Python 引導(dǎo)問(wèn)題。

Pyenv 通過(guò)修改操作系統(tǒng)的 PATH 環(huán)境變量,可不同 Python 版本之間切換,并能同時(shí)運(yùn)行多個(gè) Python 版本的命令,在不同 Python 環(huán)境下進(jìn)行測(cè)試和開發(fā)時(shí)特別實(shí)用。

pyenv 主要用于切換 Python 版本,并不直接管理虛擬環(huán)境。不過(guò),可以結(jié)合 pyenv 與 virtualenv 命令,或使用 pyenv-virtualenv 插件管理虛擬環(huán)境。

  • 定位:純Python版本管理工具(非依賴管理)。 主要用于管理多個(gè) Python 版本,而不是直接管理包,但它可以用來(lái)設(shè)置特定版本的 Python 環(huán)境,進(jìn)而使用其他包管理工具。
  • 優(yōu)點(diǎn):支持多版本無(wú)縫切換,解決“我本地是Python 3.10,服務(wù)器是3.8”的經(jīng)典問(wèn)題。
  • 缺點(diǎn):需配合venv/pipenv等使用,Windows支持較弱。
  • 場(chǎng)景:需同時(shí)維護(hù)多個(gè)Python版本的項(xiàng)目。

四、項(xiàng)目管理工具:依賴+環(huán)境+打包三位一體

1. Pipenv(Kenneth Reitz,2017)

pipenv GitHub

requests庫(kù)作者Kenneth Reitz大神的作品。但pipenv并不穩(wěn)定,例如,如果你運(yùn)行pip install…兩次,結(jié)果可能不一樣,pipenv曾承諾解決這個(gè)問(wèn)題,但實(shí)際上,它只是多次嘗試運(yùn)行pip install <單個(gè)包>,直到結(jié)果看起來(lái)差不多符合規(guī)范。顯然,這樣的方式更慢,但最終問(wèn)題依然存在。

  • 定位:首次整合pip+virtualenv的革命性工具,引入PipfilePipfile.lock管理依賴。 Python 官方曾推薦的依賴管理工具。
  • 功能:自動(dòng)創(chuàng)建虛擬環(huán)境 + 依賴管理(Pipfile 和 Pipfile.lock)。解決依賴版本沖突。
  • 優(yōu)點(diǎn):自動(dòng)管理虛擬環(huán)境,.env文件支持,統(tǒng)一開發(fā)和生產(chǎn)環(huán)境依賴。依賴哈希校驗(yàn)提升安全性。 替代傳統(tǒng) requirements.txt。
  • 缺點(diǎn):依賴解析速度慢,大型項(xiàng)目體驗(yàn)不佳。 社區(qū)活躍度下降(逐漸被 Poetry 取代)。
  • 場(chǎng)景:中小型Web應(yīng)用,追求開箱即用的團(tuán)隊(duì)。
  • 動(dòng)態(tài):2025版移除Python 3.8支持,優(yōu)化依賴解析邏輯。
# 安裝pipenv   
pip install pipenv      
# 創(chuàng)建虛擬環(huán)境并安裝依賴   
pipenv install      
# 激活虛擬環(huán)境   
pipenv shell      
# 退出虛擬環(huán)境   
exit

2. Poetry(Sébastien Eustace,2018)

poetry GitHub

  • 在uv出現(xiàn)前最好用的管理工具。
  • poetry使用pyproject.toml和poetry.lock文件來(lái)管理依賴,類似于JavaScript/Node.js的Npm和Rust的Cargo,這倆都是非常成熟好用的依賴管理方案。
  • poetry本身并不具有管理Python解釋器的功能,推薦和pyenv/pyenv-win使用,可以輕松下載和設(shè)置不同版本的Python解釋器。
  • poetry的缺點(diǎn)可能是較為復(fù)雜,上手困難。由于poetry嚴(yán)格的依賴管理策略,你可能會(huì)在安裝依賴包時(shí)遇到更多的問(wèn)題。
  • 在國(guó)內(nèi),poetry還有另一個(gè)缺點(diǎn),無(wú)法設(shè)置全局鏡像源,只可針對(duì)單個(gè)項(xiàng)目設(shè)置鏡像源。

Poetry 支持安裝和更新支持庫(kù),提供鎖文件以確保項(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 預(yù)先解析完整的依賴圖,并按拓?fù)漤樞虬惭b支持庫(kù)。

Poetry 依據(jù) pyproject.toml 管理項(xiàng)目?jī)?nèi)外的虛擬環(huán)境。

poetry.lock 文件可以確保項(xiàng)目的復(fù)用,但體積較大。此外,Poetry 還兼具構(gòu)建工具功能,可以發(fā)布 Python 包。

Poetry 的解析速度較慢,部分是因?yàn)?Python 包聲明支持庫(kù)的方式不一致,可能會(huì)導(dǎo)致支持庫(kù)解析的時(shí)間較長(zhǎng)。

  • 定位:現(xiàn)代依賴管理 + 打包工具(開源庫(kù)開發(fā)首選)。全生命周期管理(依賴+打包+發(fā)布),基于pyproject.toml。
  • 功能:一體化工具:集成了虛擬環(huán)境管理、依賴管理(pyproject.toml)和打包發(fā)布功能。
  • 優(yōu)點(diǎn):語(yǔ)義化版本控制,動(dòng)態(tài)依賴約束(如 ^1.2.3)。一體化工具鏈(開發(fā)到發(fā)布全流程)。一鍵發(fā)布PyPI,依賴樹可視化。
  • 缺點(diǎn):冷啟動(dòng)解析較慢,自定義構(gòu)建流程支持弱。 學(xué)習(xí)成本較高(需熟悉 pyproject.toml)。對(duì)舊項(xiàng)目遷移有一定成本。
  • 場(chǎng)景:復(fù)雜項(xiàng)目、開源庫(kù)開發(fā)、追求現(xiàn)代工作流。
# 安裝poetry   
pip install poetry      
# 創(chuàng)建新項(xiàng)目   
poetry new myproject      
# 添加依賴   
poetry add requests      
# 進(jìn)入虛擬環(huán)境   
poetry shell

3. PDM(Frost Ming,2020)

pdm GitHub

PDM 的目標(biāo)是成為新生代 Python 支持庫(kù)管理工具。

與 Poetry 類似,PDM 也是一款快速的支持庫(kù)解析器,主要用于大型二進(jìn)制文件分發(fā)。

它具備靈活強(qiáng)大的插件系統(tǒng)和多功能用戶腳本。

此外,PDM 還可以使用 indygreg 的 python-build-standalone 安裝 Python,并支持類似 pnpm 的集中式安裝緩存。

PDM 與 Poetry 的主要區(qū)別在于,PDM 支持 PEP-582,將虛擬環(huán)境集成到項(xiàng)目目錄中,避免了傳統(tǒng)虛擬環(huán)境的手動(dòng)激活和停用,提高了開發(fā)效率。

  • 定位:PEP 582標(biāo)準(zhǔn)實(shí)踐者,支持項(xiàng)目本地包目錄,無(wú)需虛擬環(huán)境。
  • 優(yōu)點(diǎn):依賴解析快,避免環(huán)境激活,兼容pyproject.toml
  • 缺點(diǎn):IDE支持需額外配置,非虛擬環(huán)境模式調(diào)試復(fù)雜。
  • 場(chǎng)景:追求輕量化的微服務(wù)、工具鏈開發(fā)。

4. Rye(Astral,2023)

Rye GitHub

Rye 由 Astral.sh 開發(fā),也是基于 Rust 構(gòu)建的,旨在提升開發(fā)效率和用戶體驗(yàn)。與傳統(tǒng)的包管理工具相比,Rye 的性能有顯著提升,功能也更加豐富。

Rye 希望為 Python 開發(fā)者提供一站式的工具,讓 Python 支持庫(kù)的安裝與管理更加輕松。

Rye 使用與 uv 相同的支持庫(kù)解析器,提供更快的管理體驗(yàn)。

Rye 還提供了與 poetry 類似的功能,但速度更快。

定位:Poetry的極速替代品,共享uv解析引擎

5. uv(Astral,2024)

uv GitHub

uv 是一個(gè)由 Astral 開發(fā)的高性能 Python 包管理和項(xiàng)目管理工具,用 Rust 編寫,旨在取代傳統(tǒng)的 Python 工具(如 pip、virtualenv、poetry、甚至部分 pyenv 功能)。它以極快的速度和現(xiàn)代化的設(shè)計(jì)著稱,號(hào)稱比 pip 快 10-100 倍,比 Poetry 快 2-10 倍。uv 的目標(biāo)是提供一個(gè)統(tǒng)一的、一站式的 Python 開發(fā)體驗(yàn),涵蓋包安裝、虛擬環(huán)境管理、項(xiàng)目管理和 Python 版本管理。

uv使用rust構(gòu)建,uv的維護(hù)者astral還有另一個(gè)大名鼎鼎的python代碼格式化工具ruff,在使用ruff和uv時(shí),你能明顯感覺(jué)到和其它基于python的工具的差距,指哪打哪,非常爽快。

uv和poetry一樣使用pyproject.toml和lock文件管理依賴,很現(xiàn)代,用過(guò)的都說(shuō)好。

uv還同時(shí)管理python解釋器,也就是集成了pyenv的功能,可以方便地下載和管理解釋器。在python解釋器小版本更新時(shí)(例如3.12.0→3.12.1),uv也會(huì)自動(dòng)更新,以后再也不用苦嘻嘻的去python官網(wǎng)找解釋器了。

將uv生成的項(xiàng)目拷貝到?jīng)]有python環(huán)境的電腦上,只需使用命令uv sync,uv會(huì)自動(dòng)安裝python解釋器,并接著安裝pip依賴,如果使用uv run,uv還會(huì)在全部安裝妥當(dāng)后,自動(dòng)開始運(yùn)行腳本。

uv甚至還集成了pipx安裝python全局工具的功能,例如ruff、isort、mypy、pyright這類全局工具,可以使用uv tool安裝、升級(jí)和管理。

即便你是一個(gè)純粹的“pip”命令愛(ài)好者,uv也可以滿足你。uv提供了uv pip系列命令,可以同時(shí)具備rust的爽快和pip的學(xué)院派感覺(jué),堪稱古典與現(xiàn)代的結(jié)合。

在最新的pycharm版本(2024.3.2或以上)里也添加了uv的支持,使用pycharm和uv管理項(xiàng)目甚至不需要寫命令行。

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ā)者喜愛(ài)的 ruff (用 Rust 開發(fā)的高性能 Python 代碼檢查和代碼格式化工具)。與 poetry 類似,uv 通過(guò) pyproject.toml 管理項(xiàng)目,得益于 Rust 的高效算法,其解析速度至少比 poetry 快一個(gè)量級(jí)。

定位:新一代高性能 Python 工具,Rust編寫的超高速一體化工具

功能:超高速包安裝與依賴解析(兼容 pip 和 pip-tools 工作流)。支持虛擬環(huán)境管理(類似 venv)。支持生成 requirements.txt 和 pyproject.toml。

性能對(duì)比(Jupyter項(xiàng)目):

工具冷啟動(dòng)時(shí)間熱緩存時(shí)間
pip32.1s28.7s
Poetry11.4s9.2s
uv0.5s0.02s

命令全景

uv pip install numpy          # 替代pip
uv venv .env                  # 替代virtualenv
uv python install 3.12        # 替代pyenv
uv run main.py                # 替代poetry run

定位:Rust編寫的超高速一體化工具,覆蓋pyenv+venv+pip+poetry功能。

優(yōu)點(diǎn)

  • 速度:依賴解析比pip快100倍(Jupyter項(xiàng)目冷啟動(dòng)500ms → 熱緩存20ms)
  • 全能:支持Python版本管理(uv python install)、依賴鎖定(uv lock)、腳本執(zhí)行(uv run
  • 安全:跨平臺(tái)鎖文件,哈希校驗(yàn)防篡改
  • 跨平臺(tái):支持Windows、macOS和Linux。

缺點(diǎn):生態(tài)適配中,暫不支持非Python依賴(如Conda的C++庫(kù))。

場(chǎng)景所有純Python項(xiàng)目的首選替代方案,尤其適合CI/CD流水線。

# 安裝uv   
pip install uv      
# 創(chuàng)建虛擬環(huán)境   
uv venv myenv      
# 激活虛擬環(huán)境   
# Windows   
myenv\Scripts\activate   
# macOS/Linux   
source myenv/bin/activate      
# 退出虛擬環(huán)境   
deactivate

五、科學(xué)計(jì)算:非Python依賴管理

1. Conda(Anaconda團(tuán)隊(duì),2012)

conda GitHub

conda 和 Anaconda 是兩回事:

  • conda 是包管理器(開源,BSD 許可證,仍然免費(fèi))。
  • Anaconda 是一個(gè)商業(yè)公司提供的 Python 發(fā)行版,包括 conda、本地鏡像源、大量預(yù)裝包等。

從 2020 年起,Anaconda 公司對(duì)商業(yè)用途(如公司或機(jī)構(gòu))使用其官方發(fā)行版和鏡像源實(shí)行了收費(fèi)政策:

  • 個(gè)人用戶、開源項(xiàng)目、學(xué)術(shù)研究用途仍然免費(fèi)。
  • 企業(yè)用戶如果通過(guò) Anaconda 鏡像或工具部署,需要購(gòu)買許可證。

anaconda實(shí)在過(guò)于臃腫,它的安裝包里包括了眾多科學(xué)計(jì)算會(huì)用到的packages,安裝后動(dòng)輒5-6個(gè)G。

anaconda有個(gè)不包含packages的版本,叫miniconda,但miniconda仍然存在安裝依賴庫(kù)過(guò)于激進(jìn)的問(wèn)題,安裝同樣的packages,conda總會(huì)比別的包管理器安裝更多的“依賴包”,即便有的“依賴包”并不是必須,這會(huì)導(dǎo)致你的項(xiàng)目出現(xiàn)不必要的膨脹。

同時(shí),conda的packages列表“conda list”還存在和“pip list”不一致的問(wèn)題。

Conda 是由 Anaconda 出品的命令行工具,用于在 Windows、macOS 和 Linux 上管理虛擬環(huán)境。它不僅能管理 Python 支持庫(kù),還能處理非 Python 支持庫(kù),尤其針對(duì)數(shù)據(jù)科學(xué)方面的開發(fā)進(jìn)行了優(yōu)化。

Conda 使用自己的 Conda 虛擬環(huán)境切換非 Python 依賴項(xiàng),無(wú)需使用復(fù)雜的 Docker。與 Poetry 類似,Conda 在構(gòu)建環(huán)境時(shí)執(zhí)行完整的支持庫(kù)解析,其支持庫(kù)解析器 libmamba 是用 C++ 實(shí)現(xiàn)的,速度更快。

  • 定位:跨語(yǔ)言包與環(huán)境管理(科學(xué)計(jì)算領(lǐng)域主流)。 (Python/R/CUDA)
  • 功能:管理 Python 和非 Python 依賴(如 C/C++、R 庫(kù))。自帶預(yù)編譯包(優(yōu)化科學(xué)計(jì)算庫(kù)安裝)。
  • 優(yōu)點(diǎn):跨平臺(tái):支持Windows、macOS和Linux。一鍵安裝SciPy棧,支持Python/R/CUDA等混合依賴,預(yù)編譯加速科學(xué)庫(kù)安裝。
  • 缺點(diǎn):包更新滯后PyPI,虛擬環(huán)境切換慢。 環(huán)境體積臃腫(Miniconda>1GB) 。復(fù)雜依賴解析可能沖突。
  • 場(chǎng)景:數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、跨學(xué)科項(xiàng)目。
# 創(chuàng)建虛擬環(huán)境   
conda create -n myenv python=3.8      
# 激活虛擬環(huán)境   
conda activate myenv      
# 退出虛擬環(huán)境   
conda deactivate

2. Mamba(2019年)

mamba GitHub

是Conda的改進(jìn)版,旨在解決Conda的痛點(diǎn),如慢的依賴解析和并行下載問(wèn)題,用 C++ 實(shí)現(xiàn),使用不同算法,推薦安裝方式已改變。
速度比Conda 快很多,其他方面和Conda類似。

3. Miniforge(conda-forge社區(qū),2020)

miniforge GitHub

  • 定位:Conda輕量替代版,默認(rèn)conda-forge源
  • 場(chǎng)景:數(shù)據(jù)科學(xué)輕量化部署

4. Pixi(Prefix.dev團(tuán)隊(duì),2024)

pixi GitHub

Pixi 是基于 Rust 的 rattler 庫(kù)開發(fā)的,具有顯著的性能和安全優(yōu)勢(shì)。它的理念是提供類似于 cargo 或 yarn 的開發(fā)體驗(yàn)。

Pixi 目標(biāo)是直接取代 Conda,并能像 Conda 一樣管理非 Python 依賴項(xiàng)。

2024 年 2 月,為了追求更快的速度,Pixi 將后臺(tái)的 rip 改為 uv。與 Conda 和 mamba 不同,Pixi 提供了自定義類型的鎖文件,使其在復(fù)用方面領(lǐng)先于 Conda。

Pixi 支持可復(fù)用的方式安裝支持庫(kù),并支持 Python、C++ 和 R 等多種語(yǔ)言, 且兼容所有主流操作系統(tǒng)。

Pixi 還提供了簡(jiǎn)潔而強(qiáng)大的命令行界面,使得支持庫(kù)管理更加簡(jiǎn)單、高效。

  • 定位:Conda的現(xiàn)代替代品,基于Rust構(gòu)建。 ,支持pyproject.toml
  • 優(yōu)點(diǎn):兼容Conda庫(kù)且解析更快,支持pyproject.toml。 混合管理PyPI和Conda包,解析速度提升5倍
  • 缺點(diǎn):社區(qū)包覆蓋不全。
  • 場(chǎng)景:需混合PyPI和Conda包的跨語(yǔ)言工程。

六、依賴管理工具:專治版本混亂

1. pip-tools(Vincent Driessen團(tuán)隊(duì),2013)

pip-tools GitHub

定位:生產(chǎn)級(jí)精準(zhǔn)依賴鎖定

核心命令

  • pip-compile:從.in文件生成帶哈希的requirements.txt
  • pip-sync:嚴(yán)格同步環(huán)境至鎖定狀態(tài)

場(chǎng)景:Docker鏡像構(gòu)建,生產(chǎn)服務(wù)器部署

2. pipreqs(社區(qū),2016)

pipreqs GitHub

  • 定位:基于項(xiàng)目import語(yǔ)句生成純凈requirements.txt。
  • 神技pipreqs /project --ignore node_modules --encoding=utf8
  • 優(yōu)點(diǎn):自動(dòng)忽略虛擬環(huán)境目錄,支持--ignore排除無(wú)關(guān)路徑。
  • 缺點(diǎn):無(wú)法識(shí)別動(dòng)態(tài)導(dǎo)入(如__import__('os'))。
  • 場(chǎng)景:從遺留項(xiàng)目重構(gòu)依賴,生成最小化生產(chǎn)環(huán)境清單。

3. pigar(社區(qū),2018)

pigar GitHub

  • 定位:AST解析依賴,標(biāo)注依賴在代碼中的位置。
  • 優(yōu)點(diǎn):精確識(shí)別跨版本標(biāo)準(zhǔn)庫(kù)(如Py2的futures vs Py3的concurrent.futures)。
  • 缺點(diǎn):輸出文件含位置注釋,需手動(dòng)清理后部署。
  • 場(chǎng)景:審計(jì)依賴來(lái)源,解決“這個(gè)包到底在哪用?”的靈魂拷問(wèn)。
# 輸出帶代碼位置注釋的requirements.txt
$ pigar -p /project -o requirements.txt

4. pipdeptree(社區(qū),2015)

pipdeptree GitHub

  • 定位:可視化依賴樹與沖突檢測(cè)。
  • 優(yōu)點(diǎn):提示循環(huán)依賴,生成沖突報(bào)告(如pkgA需要numpy<2.0,pkgB需要numpy>=2.0)。
  • 缺點(diǎn):需在每個(gè)虛擬環(huán)境中單獨(dú)安裝。
  • 場(chǎng)景:診斷依賴沖突,架構(gòu)治理。
# 檢測(cè)沖突示例
$ pipdeptree --warn conflict | grep "version conflict"

七、終極對(duì)比表:13款工具全景圖

工具作者/團(tuán)隊(duì)發(fā)布時(shí)間定位環(huán)境隔離Python版本安裝依賴聲明文件依賴解析器復(fù)雜度鎖文件生成跨平臺(tái)鎖文件非Python依賴管理pyproject.toml原生支持包構(gòu)建包發(fā)布CLI工具安裝Monorepo支持實(shí)現(xiàn)語(yǔ)言主要缺點(diǎn)典型適用場(chǎng)景
pipPython官方2008基礎(chǔ)包安裝器??requirements.txt低(無(wú)沖突解決)?????部分支持????Python無(wú)依賴解析、無(wú)環(huán)境隔離臨時(shí)安裝/底層引擎
virtualenvIan Bicking2007跨版本環(huán)境隔離??無(wú)無(wú)????????Python無(wú)依賴管理功能,需配合pipPython 2兼容/多解釋器測(cè)試
venvPython官方2012輕量級(jí)環(huán)境隔離??無(wú)無(wú)????????Python無(wú)法管理Python版本Python 3小型項(xiàng)目快速隔離
pyenvYasushi Saito2010解釋器版本管理??無(wú)無(wú)????????Bash/Python無(wú)依賴管理功能多Python版本切換
pipenvKenneth Reitz2017環(huán)境+依賴整合??Pipfile中(速度慢)Pipfile.lock???????Python依賴解析不穩(wěn)定,鎖文件偶發(fā)不一致中小型Web應(yīng)用
poetrySébastien Eustace2019全生命周期管理??pyproject.toml高(嚴(yán)格策略)poetry.lock????????基礎(chǔ)Python冷啟動(dòng)慢,國(guó)內(nèi)鏡像需逐項(xiàng)目設(shè)置開源庫(kù)開發(fā)/復(fù)雜依賴項(xiàng)目
pdmFrost Ming2020PEP 582項(xiàng)目本地包目錄??(可選)?pyproject.tomlpdm.lock????????基礎(chǔ)PythonIDE需手動(dòng)配置解釋器路徑微服務(wù)/CLI工具開發(fā)
ryeArmin Ronacher2023極速Poetry替代品??pyproject.toml極高(Rust引擎)requirements.lock???????Rust較新,生態(tài)適配中追求速度的現(xiàn)代項(xiàng)目
uvAstral2024超高速一體化工具鏈??pyproject.toml極高(Rust引擎)uv.lock?????? (uv tool)?Rust不支持非Python依賴(如C++庫(kù))所有純Python項(xiàng)目
condaAnaconda2012科學(xué)計(jì)算生態(tài)??environment.yml中(跨語(yǔ)言解析)無(wú)標(biāo)準(zhǔn)鎖文件????部分支持??有限??有限??Python環(huán)境臃腫,包更新滯后PyPI數(shù)據(jù)科學(xué)/AI工程
mambaQuantStack2019Conda加速版??environment.yml高(C++引擎)無(wú)標(biāo)準(zhǔn)鎖文件????部分支持??有限??有限??C++命令行兼容性偶有問(wèn)題大型科學(xué)計(jì)算項(xiàng)目
Miniforgeconda-forge社區(qū)2020Conda輕量版??environment.yml無(wú)標(biāo)準(zhǔn)鎖文件????部分支持??有限??有限??Python社區(qū)包覆蓋不全數(shù)據(jù)科學(xué)輕量化部署
pixi前綴樹科技2024Conda現(xiàn)代化替代??pyproject.toml高(Rust引擎)pixi.lock???????Rust社區(qū)包覆蓋不全跨語(yǔ)言科學(xué)計(jì)算

八、依賴管理工具時(shí)間簡(jiǎn)史

2000年,setuptools

Python2自2000年發(fā)布以來(lái),語(yǔ)言尚未完全穩(wěn)定和成型,最開始通過(guò)easy_install(2004 年發(fā)布,屬于 setuptools 的一部分)從PyPI(2003 年上線)安裝.egg格式的包。

2008年,pip+virtualenv

2008年,為了解決Python2中的一些設(shè)計(jì)缺陷和向后不兼容的問(wèn)題,發(fā)布Python 3.0。隨著社區(qū)的建設(shè),PyPI的庫(kù)越來(lái)越多,python官方發(fā)布了包管理工具pip用于從PyPI安裝庫(kù),同樣的,python的版本也在增多,不同版本之間庫(kù)版本兼容不同,pip本身只是給全局環(huán)境直接安裝一套一樣的依賴,如果有兩個(gè)項(xiàng)目依賴于同一個(gè)庫(kù)的不同版本,你是不可能同時(shí)在全局環(huán)境里把這兩個(gè)版本都裝上的。為了避免沖突,最好是給每個(gè)項(xiàng)目都有一套獨(dú)立的 pip 環(huán)境,分別安裝各自需要的依賴,這個(gè)就是虛擬環(huán)境,第三方庫(kù)率先發(fā)布了virtualenv實(shí)現(xiàn)環(huán)境管理。

2012年,venv

此時(shí),包管理和環(huán)境管理工具為pip+virtualenv。2012年,Python3.3發(fā)布,內(nèi)置了環(huán)境管理工具venv,內(nèi)置的更高效和方便,就替代了virtualenv。你用 PyCharm 創(chuàng)建項(xiàng)目時(shí),默認(rèn)會(huì)用 venv 建一個(gè)虛擬環(huán)境,也就是你看到的 venv 文件夾,就是為了讓每個(gè)項(xiàng)目都有獨(dú)立的依賴,避免沖突。

2013年,pip-tools

venv 在簡(jiǎn)單的場(chǎng)景下大概足夠了,你也可以直接進(jìn)入虛擬環(huán)境導(dǎo)出 requirements.txt 或手寫個(gè) pyproject.toml 來(lái)聲明依賴。但是你可能不太喜歡這種完全“手動(dòng)擋”的模式,而是希望有一些更加方便的工具,可以讓你直接輸入一個(gè) xxx-tool install 命令就直接檢測(cè)項(xiàng)目目錄下的 requirements.txt 或 pyproject.toml,利用里邊寫明的依賴自動(dòng)生成一個(gè)虛擬環(huán)境,如果已經(jīng)有虛擬環(huán)境就安裝缺少的庫(kù)/移除不再需要的庫(kù),然后使用 xxx-tool add lib1 這種命令就能自動(dòng)更新 requirements.txt 或 pyproject.toml并自動(dòng)在虛擬環(huán)境中安裝 lib1。

于是2013年,社區(qū)發(fā)布了pip-tools,它提供兩個(gè)命令:pip-compile 用于生成和操作依賴清單(requirements.txt,注意這個(gè) requirements.txt 和 Python 舊標(biāo)準(zhǔn)中的同名文件所功能不一樣,在 pip-tools 中它更類似于一個(gè) lockfile),pip-sync 用于根據(jù)依賴清單將其內(nèi)容與當(dāng)前虛擬環(huán)境同步。但是 pip-tools 本身不會(huì)做更多事情了,它只聚焦于提供這兩個(gè)命令——如果你需要添加/刪除一個(gè)包或?qū)⒛硞€(gè)包更新到與原本不兼容的版本,你需要先操作 pyproject.toml、使用 pip-compile 重新生成 requirements.txt,然后再用 pip-sync 同步進(jìn)去。pip-tools 本身也只是同步當(dāng)前的 pip 環(huán)境,不關(guān)心虛擬環(huán)境的事情,如果你要與 venv 一起使用,得先激活 venv 在里邊操作 pip-tools 才行。

2014年,pyenv

隨著python版本的更新,越來(lái)越多的開發(fā)者需要同時(shí)在不同的python版本下工作,手動(dòng)切換總是很麻煩。社區(qū)在2014年發(fā)布了pyenv,pyenv 是一個(gè)純Python版本管理工具(非依賴管理),pyenv 完全由純 Shell 腳本實(shí)現(xiàn),不依賴 Python。 主要用于管理多個(gè) Python 版本,而不是直接管理包,但它可以用來(lái)設(shè)置特定版本的 Python 環(huán)境,進(jìn)而使用其他包管理工具。

2017年,pipenv

目前開發(fā)工具集就是pip+venv+pip-tools+pyenv,雖然解決了需求,但是實(shí)際操作起來(lái)還是很麻煩。更復(fù)雜的是當(dāng)你試圖編寫一個(gè)庫(kù)并發(fā)布到 PyPI 的時(shí)候——此時(shí)你需要一個(gè)構(gòu)建工具、一個(gè)打包工具和一個(gè)負(fù)責(zé)把包發(fā)布到 PyPI 的工具。如果你需要一套標(biāo)準(zhǔn)流程,全部利用 Python 文檔中推薦的東西大概需要結(jié)合 setuptools + python -m build + Twine(分別負(fù)責(zé)構(gòu)建、打包和發(fā)布到 PyPI)。

此時(shí)迫切的需要一個(gè)新的工具把這一連串的流程全打通,2017年,requests庫(kù)的作者Kenneth Reitz大神出品了pipenv,首次整合pip+virtualenv的革命性工具,引入PipfilePipfile.lock管理依賴。 Python 官方曾推薦的依賴管理工具。

2018年,poetry

但pipenv并不穩(wěn)定,2018年,社區(qū)發(fā)布了poetry,這是最早可用的現(xiàn)代化項(xiàng)目管理工具,基于pyproject.toml,進(jìn)行全生命周期管理(依賴+打包+發(fā)布),是開源庫(kù)開發(fā)的首選。

2020年,PDM

Poetry 的問(wèn)題首先在于它并不完全符合標(biāo)準(zhǔn),典型的如它默認(rèn)的 pyproject.toml 格式不符合 PEP 621(盡管目前已有實(shí)驗(yàn)性支持)——因?yàn)?Poetry 的出現(xiàn)比 PEP 621 更早,自然不能未卜先知。另一個(gè)問(wèn)題在于 Poetry 在解析依賴上的性能不盡如人意,一個(gè) poetry add 常常需要花幾十秒時(shí)間,這顯然不夠理想。
所以自然出現(xiàn)了“更符合標(biāo)準(zhǔn)”的工具,2020年,社區(qū)推出了PEP 582標(biāo)準(zhǔn)實(shí)踐者PDM。

2023年,Rye

這些工具各有各的特點(diǎn),也各有各的問(wèn)題。首先是這些工具作為針對(duì)單個(gè)項(xiàng)目的依賴管理工具與構(gòu)建工具,本身并不管理 Python 本身——許多用戶是有客觀的同時(shí)使用多個(gè)版本 Python 的需求的,有些人會(huì)用 pyenv 編譯安裝多個(gè)版本的 Python,有些人直接用包管理器切換 shims,有些人則直接使用 Conda——這個(gè)需求顯然是這些項(xiàng)目管理工具做不到的;其次是工具安裝的問(wèn)題,有時(shí)我們會(huì)需要用 pip 安裝一些命令行工具,比如 black 和 ruff,但直接使用 pip 安裝到全局環(huán)境中很容易產(chǎn)生依賴沖突,也會(huì)污染全局依賴,所以有了 pipx 這樣的項(xiàng)目用于為每個(gè)工具創(chuàng)建單獨(dú)的隔離虛擬環(huán)境。

所以我們看到至少還有兩個(gè)需求,即 pyenv 與 pipx 的任務(wù)可以進(jìn)一步整合進(jìn)來(lái)。2023年,Astral.sh大神發(fā)布了基于Rust的Rye,它不僅整合了 Poetry 的功能,也可以像 pyenv 或 Conda 一樣在你的機(jī)器上管理多個(gè) Python 版本、像 pipx 一樣以隔離環(huán)境安裝工具,也整合了 ruff 作為開箱即用的 Linter 和 Formatter,對(duì) pytest 也提供了支持。Rye 實(shí)際上不像 Poetry/Hatch/PDM 一樣實(shí)現(xiàn)了自己的依賴解析系統(tǒng)和構(gòu)建后端,而只是將各種工具(uv/pip-tools、Hatchling、build、Twine 等)整合到一起,讓它們能夠協(xié)同工作,更近似一個(gè)“前端”項(xiàng)目。

2024年,uv

由于pip的速度較慢,Astral.sh于2024年2月發(fā)布了uv,一開始只是一個(gè)更快的包安裝工具和依賴解析工具,用 Rust 編寫,旨在作為 pip 和 pip-tools 性能更好的替代品。在發(fā)布之后Rye于同月把包管理由pip替換為了uv。

后來(lái),rye的初始作者最近把項(xiàng)目移交給uv團(tuán)隊(duì)了, 相當(dāng)于兩個(gè)項(xiàng)目合并。在 0.3.0 (2024/08) 加入了 python 環(huán)境管理和項(xiàng)目管理。到現(xiàn)在,已經(jīng)完全可以用uv替代Rye了。

至此,python的依賴管理工具終于迎來(lái)了短暫的終局,以后隨著python的發(fā)展和社區(qū)的發(fā)展,可能會(huì)繼續(xù)出現(xiàn)新的劃時(shí)代的工具

科學(xué)計(jì)算

科學(xué)計(jì)算環(huán)境下,由于需要用到各種語(yǔ)言的庫(kù),是一個(gè)單獨(dú)的領(lǐng)域,就統(tǒng)一說(shuō)一下。

  • 2012年,Conda/miniconda,跨語(yǔ)言包與環(huán)境管理(Python/R/CUDA)
  • 2020年,Anaconda 收費(fèi)后,conda-forge社區(qū)發(fā)布了Miniforge
  • 2019年,Mamba,作為Conda的輕量級(jí)替代品
  • 2024年,pixi,Conda的現(xiàn)代替代品,基于Rust構(gòu)建。

九、2025年工具選型黃金法則

初學(xué)者或簡(jiǎn)單項(xiàng)目:先拿pip+venv練手,掌握基本原理

庫(kù)開發(fā)者:堅(jiān)持 Poetry(生態(tài)最成熟,PyPI發(fā)布無(wú)縫銜接)

數(shù)據(jù)科學(xué): 傳統(tǒng)是Conda非Python依賴(如CUDA、MKL)必須靠它。 如果同時(shí)使用PyPI庫(kù)和團(tuán)隊(duì)協(xié)作就用Pixi

Python2舊項(xiàng)目Virtualenv管理環(huán)境,uv管理庫(kù),

重構(gòu)舊項(xiàng)目:用pipreqs+pipdeptree,先精準(zhǔn)分析依賴,再解決沖突

其他:一律推薦uv,無(wú)論腳本還是工程,Rust工具鏈的速度與體驗(yàn)碾壓傳統(tǒng)方案。

十、未來(lái)趨勢(shì)預(yù)測(cè)

Rust工具鏈統(tǒng)治uv安裝量已占PyPI流量25%(2025數(shù)據(jù)),Rye/Pixi等Rust工具將逐步取代Python實(shí)現(xiàn)工具。

標(biāo)準(zhǔn)趨同pyproject.toml成為依賴聲明事實(shí)標(biāo)準(zhǔn)(Poetry/PDM/UV/Rye/Pixi均已支持)。

AI輔助依賴協(xié)商:GPT-DependencySolver等工具將自動(dòng)解決版本沖突(實(shí)驗(yàn)階段)。

容器化融合uv run已支持直接啟動(dòng)隔離容器環(huán)境,未來(lái)工具鏈將深度整合Docker。

以上就是Python中依賴管理工具使用終極指南(保姆級(jí)教程)的詳細(xì)內(nèi)容,更多關(guān)于Python依賴管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論