Python 虛擬環(huán)境完全指南:venv、virtualenv 與 Conda詳解
1. 虛擬環(huán)境概述
1.1 什么是虛擬環(huán)境
虛擬環(huán)境是一個(gè)獨(dú)立的 Python 運(yùn)行環(huán)境,它允許你在同一臺(tái)機(jī)器上為不同的項(xiàng)目安裝不同的包和版本,而不會(huì)相互干擾。每個(gè)虛擬環(huán)境都擁有自己的 Python 解釋器副本、pip 包管理器以及獨(dú)立的第三方庫(kù)目錄。
1.2 為什么需要虛擬環(huán)境
虛擬環(huán)境主要解決 Python 開(kāi)發(fā)中的三個(gè)關(guān)鍵問(wèn)題:
- 依賴隔離:每個(gè)項(xiàng)目擁有獨(dú)立的包安裝空間,安裝某包的特定版本不會(huì)影響系統(tǒng) Python 或其他項(xiàng)目。
- 版本管理:不同項(xiàng)目可以使用不同的 Python 版本。一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目可能需要 Python 3.11 以獲得更好性能,而遺留代碼庫(kù)可能需要 Python 3.8 來(lái)兼容舊庫(kù)。
- 可復(fù)現(xiàn)性:通過(guò)導(dǎo)出依賴列表,團(tuán)隊(duì)成員可以在不同機(jī)器上精確復(fù)現(xiàn)同一套開(kāi)發(fā)環(huán)境,消除"在我機(jī)器上可以運(yùn)行"的問(wèn)題。
如果不使用虛擬環(huán)境,在全局安裝不兼容的包可能導(dǎo)致系統(tǒng)工具不可用,嚴(yán)重時(shí)甚至需要重裝操作系統(tǒng)。
2. venv 模塊詳解
2.1 簡(jiǎn)介
venv 是 Python 標(biāo)準(zhǔn)庫(kù)自帶的虛擬環(huán)境管理模塊,從 Python 3.3 開(kāi)始引入。它無(wú)需額外安裝,是 Python 官方推薦的默認(rèn)虛擬環(huán)境管理方式。
2.2 創(chuàng)建虛擬環(huán)境
進(jìn)入項(xiàng)目目錄,執(zhí)行以下命令創(chuàng)建虛擬環(huán)境:
python -m venv myenv
該命令會(huì)創(chuàng)建一個(gè) myenv 目錄,其中包含:Python 解釋器的副本、標(biāo)準(zhǔn)庫(kù)、pip 包管理器以及用于激活環(huán)境的腳本。
指定 Python 版本:當(dāng)系統(tǒng)存在多個(gè) Python 安裝時(shí),可以通過(guò)指定 Python 版本來(lái)創(chuàng)建環(huán)境:
# 使用 Python 3.11 創(chuàng)建虛擬環(huán)境 python3.11 -m venv myenv
venv 會(huì)使用所調(diào)用 Python 解釋器的版本來(lái)創(chuàng)建環(huán)境,因此只需調(diào)用對(duì)應(yīng)的 python3.x 命令即可切換版本。
重要說(shuō)明:venv 創(chuàng)建的虛擬環(huán)境會(huì)固定到創(chuàng)建時(shí)所使用的 Python 版本。如需使用不同版本的 Python,可以加載對(duì)應(yīng)的 Python 模塊后再創(chuàng)建,或轉(zhuǎn)而使用 Conda。
常用創(chuàng)建選項(xiàng):
| 選項(xiàng) | 說(shuō)明 |
|---|---|
--system-site-packages | 允許虛擬環(huán)境訪問(wèn)系統(tǒng)全局安裝的包 |
--clear | 如果環(huán)境目錄已存在,先清空再創(chuàng)建 |
--upgrade | 使用最新的 Python 可執(zhí)行文件升級(jí)環(huán)境 |
2.3 激活虛擬環(huán)境
激活方式因操作系統(tǒng)而異:
Linux / macOS:
source myenv/bin/activate
Windows Command Prompt:
myenv\Scripts\activate.bat
Windows PowerShell:
.\myenv\Scripts\Activate.ps1
激活成功后,終端提示符會(huì)顯示環(huán)境名稱,表明當(dāng)前已進(jìn)入虛擬環(huán)境:
(myenv) user@machine:~/project$
此后所有 pip install 命令安裝的包都會(huì)指向該虛擬環(huán)境,而非系統(tǒng) Python。
驗(yàn)證激活是否成功:可以執(zhí)行 pip list 查看依賴是全局還是當(dāng)前環(huán)境,或查看命令行前面是否有 (myenv) 標(biāo)識(shí)。
2.4 安裝與管理包
在激活的虛擬環(huán)境中,像平常一樣使用 pip:
pip install requests pandas numpy
這些包只會(huì)安裝在當(dāng)前虛擬環(huán)境中,可通過(guò) pip list 驗(yàn)證:
pip list
2.5 導(dǎo)出與重建依賴
將當(dāng)前環(huán)境中的所有包及版本導(dǎo)出到文件:
pip freeze > requirements.txt
在新環(huán)境中通過(guò)該文件重建完全相同的依賴:
pip install -r requirements.txt
2.6 退出虛擬環(huán)境
deactivate
提示符中的環(huán)境名會(huì)消失,后續(xù)操作將回到系統(tǒng) Python 環(huán)境。
3. virtualenv 工具詳解
3.1 簡(jiǎn)介
virtualenv 是一個(gè)功能更強(qiáng)大的第三方虛擬環(huán)境管理工具,出現(xiàn)時(shí)間早于 venv。雖然需要單獨(dú)安裝,但它支持更舊的 Python 版本(2.7+),并提供了更多的自定義選項(xiàng)和更快的環(huán)境創(chuàng)建速度。
3.2 安裝 virtualenv
pip install virtualenv
安裝完成后,可以通過(guò)以下命令驗(yàn)證:
virtualenv --version
3.3 創(chuàng)建虛擬環(huán)境
基本創(chuàng)建命令:
virtualenv myenv
這會(huì)創(chuàng)建一個(gè)與 virtualenv 自身相同 Python 版本的虛擬環(huán)境。
指定 Python 版本:
virtualenv -p python3.10 myenv
或使用完整路徑指定解釋器:
virtualenv -p /usr/bin/python3.8 myenv
其他有用選項(xiàng):
| 選項(xiàng) | 說(shuō)明 |
|---|---|
--no-pip | 創(chuàng)建不包含 pip 的環(huán)境(之后可單獨(dú)安裝) |
--system-site-packages | 允許環(huán)境訪問(wèn)系統(tǒng)全局安裝的包 |
--no-vcs-ignore | 不在環(huán)境目錄中創(chuàng)建 VCS 忽略文件(如 .gitignore) |
3.4 激活與退出
激活方式與 venv 完全相同:
Linux / macOS:
source myenv/bin/activate
Windows:
.\myenv\Scripts\activate
退出:
deactivate
3.5 安裝與管理包
與 venv 相同,激活環(huán)境后使用 pip 進(jìn)行包管理:
pip install package_name pip freeze > requirements.txt
3.6 virtualenvwrapper 擴(kuò)展
virtualenvwrapper 是一套基于 virtualenv 的擴(kuò)展工具,提供了更方便的命令行接口來(lái)管理虛擬環(huán)境。
安裝:
pip install virtualenvwrapper
配置(在 ~/.bashrc 或 ~/.zshrc 中添加):
export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh
常用命令:
| 命令 | 說(shuō)明 |
|---|---|
mkvirtualenv myenv | 創(chuàng)建虛擬環(huán)境 |
workon myenv | 激活虛擬環(huán)境 |
deactivate | 退出虛擬環(huán)境 |
rmvirtualenv myenv | 刪除虛擬環(huán)境 |
lsvirtualenv | 列出所有虛擬環(huán)境 |
4. Conda 環(huán)境管理詳解
4.1 簡(jiǎn)介
Conda 是一個(gè)跨平臺(tái)、跨語(yǔ)言的包管理和環(huán)境管理系統(tǒng)。與 venv 和 virtualenv 的顯著不同在于,Conda 不僅可以管理 Python 包,還能管理 R 包、C/C++ 庫(kù)等任何類型的軟件包,并且會(huì)自動(dòng)處理包之間的復(fù)雜依賴關(guān)系。它通過(guò)安裝預(yù)編譯的二進(jìn)制包來(lái)工作,這使得它在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)和科學(xué)計(jì)算領(lǐng)域尤為流行。
4.2 安裝 Conda
可以從以下兩種發(fā)行版中選擇安裝:
- Anaconda:包含 Conda、Python 以及超過(guò) 150 個(gè)常用科學(xué)計(jì)算包,體積較大。
- Miniconda:僅包含 Conda 和 Python,體積小,用戶可按需安裝其他包。推薦有一定經(jīng)驗(yàn)的用戶使用。
安裝后,建議初始化 shell 并關(guān)閉自動(dòng)激活 base 環(huán)境:
conda init bash # Linux/macOS conda config --set auto_activate_base false
重啟終端后生效。
4.3 創(chuàng)建虛擬環(huán)境
基本創(chuàng)建:
conda create --name myenv
這會(huì)創(chuàng)建一個(gè)名為 myenv 的空環(huán)境。
指定 Python 版本(最常見(jiàn)用法):
conda create --name myenv python=3.10
還可以指定版本范圍:
conda create --name myenv "python>=3.10"
創(chuàng)建時(shí)同時(shí)安裝包:
conda create --name myenv python=3.10 numpy pandas matplotlib
指定包的精確版本:
conda create --name myenv python=3.10 numpy=1.24 pandas=2.0
克隆現(xiàn)有環(huán)境:
conda create --name newenv --clone oldenv
4.4 激活與退出
激活環(huán)境(適用于所有平臺(tái)):
conda activate myenv
激活后終端提示符會(huì)顯示環(huán)境名稱。
退出環(huán)境:
conda deactivate
4.5 安裝與管理包
激活環(huán)境后,可以使用 conda 或 pip 安裝包:
# 使用 conda 安裝 conda install numpy pandas # 從特定 channel 安裝(如 conda-forge) conda install -c conda-forge scipy # 使用 pip 安裝 conda 倉(cāng)庫(kù)中不存在的包 pip install some-package
4.6 環(huán)境列表與查看
# 列出所有環(huán)境 conda env list # 查看當(dāng)前環(huán)境信息 conda info --envs # 搜索可用的包版本 conda search pandas
4.7 導(dǎo)出與重建環(huán)境
導(dǎo)出環(huán)境到 YAML 文件:
conda env export --from-history > environment.yml
這會(huì)生成一個(gè)包含環(huán)境所有信息的 YAML 文件。
示例 environment.yml 文件:
name: myproject
channels:
- conda-forge
- defaults
dependencies:
- python=3.11
- numpy=1.24
- pandas=2.0
- scikit-learn=1.3
- matplotlib=3.7
- jupyter
- pip
- pip:
- pygwalker從 YAML 文件重建環(huán)境:
conda env create -f environment.yml
4.8 刪除環(huán)境
conda env remove --name myenv
或使用 --all 刪除環(huán)境及所有關(guān)聯(lián)包:
conda remove -n myenv --all
4.9 管理 Channels
Conda 通過(guò) channels 來(lái)獲取包,常用的 channel 是 conda-forge(社區(qū)維護(hù)的龐大軟件倉(cāng)庫(kù))。配置 channel 優(yōu)先級(jí)可以獲得更穩(wěn)定可靠的依賴解析:
# 添加 conda-forge channel conda config --add channels conda-forge # 設(shè)置嚴(yán)格 channel 優(yōu)先級(jí) conda config --set channel_priority strict
5. 三者對(duì)比分析
5.1 核心特性對(duì)比表
| 維度 | venv | virtualenv | Conda |
|---|---|---|---|
| 來(lái)源 | Python 標(biāo)準(zhǔn)庫(kù)(內(nèi)置) | 第三方工具(需安裝) | 第三方工具(需安裝) |
| 適用語(yǔ)言 | 僅 Python | 僅 Python | Python、R、C/C++ 等多語(yǔ)言 |
| 包管理器 | pip | pip | conda + pip |
| 包類型 | Python 包(源碼/whl) | Python 包(源碼/whl) | 預(yù)編譯二進(jìn)制包(任何語(yǔ)言) |
| Python 版本支持 | Python 3.3+ | Python 2.7+ / 3.x | 不限制 |
| 依賴解析 | pip 解析(較弱) | pip 解析(較弱) | conda 解析(較強(qiáng),自動(dòng)處理復(fù)雜依賴) |
| 創(chuàng)建速度 | 標(biāo)準(zhǔn) | 較快(優(yōu)化過(guò)) | 較慢(需下載二進(jìn)制包) |
| 跨平臺(tái) | 是 | 是 | 是 |
| 環(huán)境位置 | 項(xiàng)目目錄內(nèi) | 項(xiàng)目目錄內(nèi) | 用戶目錄或自定義位置 |
5.2 功能維度詳細(xì)對(duì)比
包管理范圍
- venv 和 virtualenv:主要關(guān)注 Python 包的隔離,使用 pip 管理依賴,對(duì)于非 Python 依賴(如系統(tǒng)級(jí)的 C 庫(kù))管理能力較弱。
- Conda:可以管理任何類型的包,包括 Python 包、R 包、C/C++ 庫(kù)、系統(tǒng)級(jí)工具等,并會(huì)自動(dòng)處理跨語(yǔ)言的包依賴關(guān)系。Conda 還可以直接安裝 Python 和 pip 這些基礎(chǔ)工具,減少了環(huán)境初始配置時(shí)間。
性能與環(huán)境創(chuàng)建
- virtualenv:通過(guò)符號(hào)鏈接和優(yōu)化策略,創(chuàng)建速度比 venv 更快。
- venv:作為內(nèi)置模塊,無(wú)額外依賴,啟動(dòng)和使用最為輕量。
- Conda:創(chuàng)建環(huán)境時(shí)需下載二進(jìn)制包,速度相對(duì)較慢,但環(huán)境一旦建立后管理高效。
Python 版本兼容性
- venv:僅支持 Python 3.3 及以上版本,不支持 Python 2。
- virtualenv:對(duì) Python 2 和 Python 3 都有良好支持,適合需要維護(hù)遺留項(xiàng)目的場(chǎng)景。
- Conda:不依賴系統(tǒng) Python 版本,可以在環(huán)境中安裝任意版本 Python,完全獨(dú)立于系統(tǒng)安裝。
5.3 適用場(chǎng)景分析
| 場(chǎng)景 | 推薦工具 |
|---|---|
| 簡(jiǎn)單的 Python 3 項(xiàng)目 | venv(內(nèi)置,零配置) |
| 同時(shí)涉及 Python 2 和 Python 3 | virtualenv |
| 數(shù)據(jù)科學(xué)與機(jī)器學(xué)習(xí)項(xiàng)目 | Conda(科學(xué)計(jì)算包集成度高) |
| 需要管理非 Python 二進(jìn)制依賴 | Conda |
| 追求最小化安裝和輕量化 | venv |
| 多語(yǔ)言混合項(xiàng)目(Python + R 等) | Conda |
| 快速原型開(kāi)發(fā) | venv 或 virtualenv |
| 生產(chǎn)環(huán)境部署需精確復(fù)現(xiàn) | Conda(YAML 環(huán)境文件)或 venv(requirements.txt) |
6. 總結(jié)與建議
6.1 工具選擇指南
- 入門或簡(jiǎn)單項(xiàng)目:優(yōu)先使用 Python 內(nèi)置的 venv。它零依賴、無(wú)需額外安裝,完全滿足大多數(shù) Python 項(xiàng)目的需求。
- 需要兼容舊版本 Python:選擇 virtualenv。它是目前對(duì) Python 2.7 支持最好的虛擬環(huán)境工具,同時(shí)提供了更多的自定義選項(xiàng)和擴(kuò)展工具(如 virtualenvwrapper)。
- 數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)或科學(xué)計(jì)算領(lǐng)域:選擇 Conda。Conda 對(duì) NumPy、SciPy、scikit-learn 等科學(xué)計(jì)算包的二進(jìn)制管理極其高效,可以避免編譯 C 擴(kuò)展帶來(lái)的各種麻煩。此外,Conda 通過(guò) YAML 環(huán)境文件提供了強(qiáng)大的環(huán)境復(fù)現(xiàn)能力,非常適合團(tuán)隊(duì)協(xié)作和生產(chǎn)部署。
- 需要管理非 Python 依賴:無(wú)條件選擇 Conda。venv 和 virtualenv 的能力邊界止于 Python 生態(tài),而 Conda 可以管理任何類型的依賴。
6.2 最佳實(shí)踐
- 始終使用虛擬環(huán)境:為每個(gè)項(xiàng)目創(chuàng)建獨(dú)立的虛擬環(huán)境,避免依賴沖突。
- 使用 requirements.txt 或 environment.yml:將依賴列表納入版本控制(Git),確保團(tuán)隊(duì)環(huán)境一致。
- 忽略環(huán)境目錄:將
venv/、.venv/或env/目錄添加到.gitignore文件中,避免將虛擬環(huán)境提交到版本庫(kù)。 - 合理選擇環(huán)境位置:Python 虛擬環(huán)境創(chuàng)建后不可移動(dòng),需提前規(guī)劃好安裝位置。
- 定期更新依賴:在虛擬環(huán)境中定期使用
pip或conda更新包,以獲取安全修復(fù)和新功能。 - 在激活狀態(tài)下操作:安裝包或運(yùn)行腳本前,務(wù)必確認(rèn)虛擬環(huán)境已激活,避免將包意外安裝到全局環(huán)境。
6.3 快速參考:三工具核心命令
| 操作 | venv | virtualenv | Conda |
|---|---|---|---|
| 創(chuàng)建環(huán)境 | python -m venv myenv | virtualenv myenv | conda create -n myenv python=3.10 |
| 激活環(huán)境 | source myenv/bin/activate(Linux) | 同 venv | conda activate myenv |
| 退出環(huán)境 | deactivate | deactivate | conda deactivate |
| 安裝包 | pip install pkg | pip install pkg | conda install pkg |
| 導(dǎo)出依賴 | pip freeze > requirements.txt | 同 venv | conda env export > environment.yml |
| 刪除環(huán)境 | 刪除目錄即可 | 刪除目錄即可 | conda env remove -n myenv |
| 列出環(huán)境 | 無(wú)內(nèi)置命令 | lsvirtualenv(需 wrapper) | conda env list |
到此這篇關(guān)于Python 虛擬環(huán)境完全指南:venv、virtualenv 與 Conda詳解的文章就介紹到這了,更多相關(guān)Python venv、virtualenv 與 Conda內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何將OpenCV攝像頭視頻流通過(guò)瀏覽器播放
這篇文章主要介紹了Python如何將OpenCV攝像頭視頻流通過(guò)瀏覽器播放的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Python入門學(xué)習(xí)之字符串與比較運(yùn)算符
這篇文章主要介紹了Python入門學(xué)習(xí)之字符串與比較運(yùn)算符,是Python語(yǔ)法中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
基于Python實(shí)現(xiàn)身份證信息識(shí)別功能
身份證是用于證明個(gè)人身份和身份信息的官方證件,在現(xiàn)代社會(huì)中,身份證被廣泛應(yīng)用于各種場(chǎng)景,如就業(yè)、教育、醫(yī)療、金融等,它包含了個(gè)人的基本信息,本文給大家介紹了如何基于Python實(shí)現(xiàn)身份證信息識(shí)別功能,感興趣的朋友可以參考下2024-01-01
關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法
今天小編就為大家分享一篇關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
基于Python實(shí)現(xiàn)簡(jiǎn)易的植物識(shí)別小系統(tǒng)
這篇文章主要介紹了利用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的植物識(shí)別系統(tǒng),文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的小伙伴可以參考一下2021-12-12
基于Django框架的rest_framework的身份驗(yàn)證和權(quán)限解析
Django 是一個(gè)基于 Python 的 Web 框架,可讓您快速創(chuàng)建高效的 Web 應(yīng)用程序,這篇文章主要介紹了基于Django框架的rest_framework的身份驗(yàn)證和權(quán)限解析,需要的朋友可以參考下2023-05-05
對(duì)pandas的dataframe繪圖并保存的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇對(duì)pandas的dataframe繪圖并保存的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08

