境完全指南:venv依賴隔離與實(shí)戰(zhàn)排錯(cuò))
今天聊點(diǎn)Python開發(fā)者每天都在用、但很少人真正放在心上講清楚的東西——虛擬環(huán)境。我見過太多同事和學(xué)員在項(xiàng)目里遇到“環(huán)境爆炸”A項(xiàng)目要Django 3.2B項(xiàng)目要Django 4.2來回升級(jí)、卸載、裝包最后整個(gè)系統(tǒng)的Python一團(tuán)糟連哪個(gè)項(xiàng)目用的是哪個(gè)版本都分不清。Python自帶的venv就是解決這個(gè)問題的標(biāo)準(zhǔn)方案它能把每個(gè)項(xiàng)目的依賴隔離在獨(dú)立目錄下互不干擾。這篇東西不打算只貼命令我會(huì)把為什么要這么做、底層發(fā)生了什么、以及實(shí)際操作中出現(xiàn)過的各種詭異報(bào)錯(cuò)都梳理一遍。1. 虛擬環(huán)境是什么為什么項(xiàng)目的“依賴隔離”如此重要1.1 依賴沖突是怎么發(fā)生的很多初學(xué)者一開始是直接用系統(tǒng)Python裝包的。沒事的時(shí)候一切安好直到你在同一個(gè)解釋器上裝了兩個(gè)都需要某第三方庫的項(xiàng)目而它們需要不同版本問題就來了。舉一個(gè)很常見的場景項(xiàng)目A需要django3.2項(xiàng)目B需要django4.2。你先是按A的要求裝了3.2做A項(xiàng)目時(shí)一切正常后來B項(xiàng)目的同事告訴你“要用新版本特性”你執(zhí)行pip install django4.2版本升級(jí)成功B項(xiàng)目也跑起來了??傻鹊侥阍俅蜷_A項(xiàng)目發(fā)現(xiàn)管理后臺(tái)的某些寫法開始報(bào)警告甚至直接報(bào)錯(cuò)因?yàn)?.2改了API行為。這不是Django獨(dú)有的問題numpy、pandas、requests、web框架這類高頻依賴幾乎每個(gè)Python開發(fā)者都撞上過。除了版本沖突還有“環(huán)境污染”。你用系統(tǒng)的pip裝了一堆亂七八糟的包時(shí)間一長你根本分不清哪個(gè)包是哪個(gè)項(xiàng)目的。某天你想瘦身一下系統(tǒng)隨手卸載一個(gè)看起來沒用的包結(jié)果另一項(xiàng)目啟動(dòng)時(shí)當(dāng)場崩潰。這些都是沒有隔離帶來的真實(shí)成本。venv的存在就是給每個(gè)項(xiàng)目開一間獨(dú)立的“操作間”。你的系統(tǒng)Python可以保持干凈項(xiàng)目A在它自己的目錄里安裝依賴項(xiàng)目B也互不干擾誰也不會(huì)動(dòng)了誰的奶酪。1.2 venv的工作原理它到底做了什么venv全稱是Virtual EnvironmentPython 3.3以后自帶不需要額外安裝庫。它的本質(zhì)是創(chuàng)建了一個(gè)看起來像獨(dú)立Python安裝目錄的文件夾——里面包含了一個(gè)“模擬”的解釋器、管理腳本以及一個(gè)獨(dú)立存放第三方包的site-packages目錄。關(guān)鍵點(diǎn)在于venv并不是把解釋器完整復(fù)制一份而是基于“借用”系統(tǒng)Python的方式工作。Windows下venv目錄里的Scripts/python.exe通常是一個(gè)小的可執(zhí)行文件它會(huì)找到創(chuàng)建時(shí)指定的基礎(chǔ)Python解釋器而Linux/macOS下bin/python更常見的是符號(hào)鏈接指向基礎(chǔ)Python。所以創(chuàng)建venv的速度非??煲膊恍枰螺d安裝包因?yàn)榈讓咏忉屍魇乾F(xiàn)成的。真正獨(dú)立的是第三方包安裝區(qū)。一個(gè)典型的venv結(jié)構(gòu)長這樣.venv/ ├── Include/ # Windows下的C頭文件可選 ├── Lib/ # 核心庫目錄Windows ├── Scripts/ # 可執(zhí)行腳本W(wǎng)indows ├── lib/ # 核心庫Linux/macOS ├── bin/ # 可執(zhí)行腳本Linux/macOS ├── pyvenv.cfg # 配置文件指向基礎(chǔ)解釋器 └── .gitignore # 創(chuàng)建時(shí)自動(dòng)生成建議保留pyvenv.cfg是理解venv的關(guān)鍵文件。它里面通常寫成這樣home C:\Users\yourname\AppData\Local\Programs\Python\Python311 include-system-site-packages false version 3.11.4 executable C:\Users\yourname\AppData\Local\Programs\Python\Python311\python.exe command C:\Users\yourname\AppData\Local\Programs\Python\Python311\python.exe -m venv .venvhome里寫的是基礎(chǔ)解釋器的位置include-system-site-packages false表示不把系統(tǒng)Python的全局包帶進(jìn)venv——這正是隔離的核心開關(guān)。當(dāng)你啟動(dòng)venv時(shí)Python看到這個(gè)配置文件就會(huì)把第三方包的搜索入口指向venv自己的site-packages而不是系統(tǒng)那個(gè)。1.3 venv與系統(tǒng)Python的邊界在哪很多人以為激活venv以后你用到的所有包都來自venv系統(tǒng)的包完全不會(huì)被看到。這大體上是對(duì)的但有個(gè)隱藏項(xiàng)需要注意如果你當(dāng)初創(chuàng)建venv時(shí)沒有顯式排除系統(tǒng)包也并非絕對(duì)防火墻。include-system-site-packages參數(shù)默認(rèn)是false。但如果有人在創(chuàng)建時(shí)故意把它改成true或者創(chuàng)建時(shí)用了--system-site-packages參數(shù)那么這個(gè)venv會(huì)把系統(tǒng)Python site-packages里的包也一并暴露出來。這種情況在某些預(yù)裝Python的Linux發(fā)行版上偶爾會(huì)遇到比如你明明在venv里沒裝某個(gè)包import卻成功了查了一圈發(fā)現(xiàn)是系統(tǒng)包被帶進(jìn)來“漏”進(jìn)來的。所以排障時(shí)要多留個(gè)心眼import sys; print(sys.prefix)可以快速確認(rèn)當(dāng)前解釋器是不是venv的python -m pip list能看出當(dāng)前環(huán)境的包列表。判斷邊界這件事直接看sys.prefix最準(zhǔn)——venv環(huán)境下它會(huì)指向venv目錄系統(tǒng)環(huán)境下它會(huì)指向Python安裝目錄。2. 創(chuàng)建與激活venv從零到可用的完整實(shí)操2.1 創(chuàng)建前檢查你的Python裝對(duì)了嗎在創(chuàng)建venv之前先確認(rèn)基礎(chǔ)Python能正常工作。打開終端或命令行敲一下python --version或者有些系統(tǒng)是python3 --version能正常顯示版本號(hào)說明Python本身沒問題。如果提示“python 不是內(nèi)部或外部命令”那大概率是環(huán)境變量沒有配好得先把Python安裝目錄加入PATH再繼續(xù)后續(xù)操作。這里有個(gè)非常重要的細(xì)節(jié)盡量用python -m venv而不是直接運(yùn)行某個(gè)具體的venv模塊路徑。因?yàn)?m會(huì)嚴(yán)格基于你當(dāng)前選中的那個(gè)Python解釋器來創(chuàng)建環(huán)境保證你對(duì)準(zhǔn)了版本。我見過不少人在Windows上裝了多個(gè)Python版本用python3創(chuàng)建環(huán)境用python激活環(huán)境結(jié)果解釋器版本對(duì)不上pip還列表混亂。2.2 Windows下全程實(shí)操PowerShell與CMDWindows上用PowerShell是最常見的場景。我推薦的目錄名是.venv放在項(xiàng)目根目錄下這樣IDE和很多工具能自動(dòng)識(shí)別。創(chuàng)建環(huán)境python -m venv .venv激活環(huán)境.venv\Scripts\Activate.ps1激活成功后命令行提示符前面會(huì)出現(xiàn)(.venv)前綴例如(.venv) PS C:\myproject如果你看到類似“無法加載文件 .venv\Scripts\Activate.ps1因?yàn)樵诖讼到y(tǒng)上禁止運(yùn)行腳本”的報(bào)錯(cuò)說明PowerShell執(zhí)行策略默認(rèn)不讓你運(yùn)行腳本。解決辦法有兩種一是臨時(shí)切換執(zhí)行策略推薦只對(duì)當(dāng)前用戶生效Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser二是干脆用CMD來激活執(zhí)行.venv\Scripts\activate.bat區(qū)別在于.bat是給CMD用的Activate.ps1是給PowerShell用的而.venv\Scripts\python.exe是給一切工具直接調(diào)用的解釋器入口。我個(gè)人的習(xí)慣是即使不激活環(huán)境也能直接用.venv\Scripts\python.exe來運(yùn)行腳本、安裝包。這樣隔離效果是一樣的只是命令行前綴看起來沒那么直觀。2.3 macOS/Linux下全程實(shí)操macOS和Linux的基本操作一致只是路徑從Scripts變成了bin。創(chuàng)建環(huán)境python3 -m venv .venv激活環(huán)境source .venv/bin/activate看到(.venv)前綴即代表激活成功。退出環(huán)境的命令是deactivateWindows同樣用deactivate退出。注意這不是一個(gè)獨(dú)立腳本而是激活時(shí)注入到shell里的一個(gè)函數(shù)所以退出后它會(huì)從當(dāng)前shell移除。2.4 python3.10.11 -m venv不成功的排查我搜索“Python虛擬環(huán)境”相關(guān)關(guān)鍵詞時(shí)注意到一個(gè)高頻問題python3.10.11 -m venv不成功。這通常不是版本書寫錯(cuò)了而是明顯存在環(huán)境或組件問題。常見的幾個(gè)原因Python安裝時(shí)缺失了venv相關(guān)組件。在Windows上安裝Python時(shí)如果沒有勾選“pip”“tcl/tk”或“venv”等可選組件后續(xù)創(chuàng)建時(shí)可能報(bào)“ensurepip is not available”或“module venv not found”。解決方案是重新運(yùn)行安裝程序選擇Modify把需要的組件補(bǔ)上或者干脆卸載重裝勾選全部組件。Python可執(zhí)行文件不在PATH里或者同時(shí)存在多個(gè)版本。如果你在終端輸入python或python3得到的不是Python 3.10.11而是其他版本那創(chuàng)建出來的venv自然對(duì)不上。用python --version確認(rèn)一下再動(dòng)手。目錄路徑包含中文、空格或特殊字符。這個(gè)問題在Windows上尤其突出比如路徑中有中文用戶名。它會(huì)影響某些工具腳本比如PyCharm在調(diào)用.venv\Scripts\python.exe時(shí)如果路徑帶中文可能會(huì)報(bào)cannot run program c:\users\中文用戶名\desktop\pythonproject\.venv\scripts\python.exe之類的錯(cuò)誤。遇到這種問題最省事的方法是把項(xiàng)目放到一個(gè)純英文且沒有空格路徑的目錄下比如D:\projects\myproject。如果項(xiàng)目確實(shí)必須在原位置運(yùn)行可以換用py -3.10 -m venv .venv這種方式來創(chuàng)建Windows下用py啟動(dòng)器同時(shí)確認(rèn)你的工具鏈能處理這個(gè)路徑。用了錯(cuò)誤的命令格式。python3.10.11這種寫法并不是一個(gè)通用的可執(zhí)行命令名除非你剛好有這樣一個(gè)別名。正確做法是python3 --version確認(rèn)你的版本然后用python3 -m venv .venv創(chuàng)建或者在Windows上直接python -m venv .venv。排查思路很直接先確認(rèn)Python能運(yùn)行、版本正確再看創(chuàng)建時(shí)具體報(bào)什么錯(cuò)最后檢查路徑問題。這三板斧基本能解決八成“venv創(chuàng)建失敗”。3. 依賴管理requirements.txt與pyproject.toml的實(shí)戰(zhàn)選擇3.1 別再用pip freeze一刀切了很多教程教你用pip freeze requirements.txt來導(dǎo)出依賴這確實(shí)是最快的做法但也是隱藏坑最多的做法。pip freeze會(huì)把當(dāng)前環(huán)境中所有已安裝的包——包括間接依賴——全部列出來并且?guī)暇_版本號(hào)。聽起來很嚴(yán)謹(jǐn)?shù)珜?shí)際項(xiàng)目里幾乎沒人愿意手動(dòng)維護(hù)幾百行間接依賴的清單。更麻煩的是當(dāng)你把這個(gè)文件拿給同事裝的時(shí)候版本號(hào)之間有時(shí)本身就有沖突關(guān)系比如A1.0依賴B2.0而另一個(gè)包鎖了B1.5那安裝時(shí)就可能報(bào)依賴沖突。所以我的建議是項(xiàng)目里維護(hù)頂層依賴清單而不是凍結(jié)所有間接依賴。遇到需要固定關(guān)鍵版本的地方再單獨(dú)標(biāo)注。頂層依賴清單邏輯上很清晰比如“我用Django做Web、用requests調(diào)接口、用celery做異步任務(wù)”就寫這幾項(xiàng)。間接依賴交給pip自己解析即可。3.2 requirements.txt的正確寫法與安裝一個(gè)比較合理的requirements.txt長這樣django4.2,5.0 requests2.32.3 celery5.3,6.0 python-dotenv~1.0版本符號(hào)的含義鎖定精確版本。下限允許更高版本。上限防止未來大版本破壞兼容性。~兼容版本號(hào)比如~1.0相當(dāng)于1.0,2.0如果寫成~1.4.1則相當(dāng)于1.4.1,1.5.0。安裝時(shí)pip install -r requirements.txt這套做法既保證了自己能復(fù)現(xiàn)環(huán)境又不會(huì)把依賴綁得太死。對(duì)新手而言鎖版本是最穩(wěn)妥的對(duì)有一定經(jīng)驗(yàn)的項(xiàng)目建議把主要直接依賴寫明白然后配合一個(gè)鎖定版本來做線上部署。3.3 pyproject.toml更適合現(xiàn)代項(xiàng)目的依賴聲明Python社區(qū)這幾年越來越傾向用pyproject.toml來聲明項(xiàng)目元數(shù)據(jù)和依賴。這個(gè)文件同時(shí)也能讓任何工具識(shí)別項(xiàng)目的依賴關(guān)系。一個(gè)最小示例[project] name my-project version 0.1.0 requires-python 3.9 dependencies [ django4.2,5.0, requests2.32.3, ]有了這個(gè)文件你只需要在venv里執(zhí)行pip install -e .它就會(huì)把當(dāng)前項(xiàng)目連同聲明的依賴一起裝到venv里。這樣做的好處是項(xiàng)目的依賴聲明跟著代碼倉庫走不再需要一個(gè)單獨(dú)維護(hù)的requirements文件而且支持更多元數(shù)據(jù)比如項(xiàng)目名稱、版本、作者等。如果你的項(xiàng)目將來要打包發(fā)布pyproject.toml更是標(biāo)配。對(duì)起步階段的小項(xiàng)目用requirements就夠了一旦項(xiàng)目開始做包管理、發(fā)布或者團(tuán)隊(duì)多人協(xié)作強(qiáng)烈建議切到pyproject.toml。3.4 為什么在venv里pip install還會(huì)裝到系統(tǒng)這是個(gè)非常常見且讓人抓狂的問題明明右下角看著是venv環(huán)境執(zhí)行pip install flask結(jié)果卻裝到了系統(tǒng)Python目錄。我排查過好幾次這類問題原因不外乎你激活了venv但調(diào)用的pip不是venv里的pip。比如在Windows上你之前設(shè)過pip的別名或者有其他版本的pip在PATH最前面。驗(yàn)證方法是在終端執(zhí)行Get-Command pipPowerShell或which pipLinux/macOS看它指向哪個(gè)路徑。沒有激活venv卻以為處在venv里。終端窗口開多了就容易搞混。穩(wěn)妥做法是安裝時(shí)用python -m pip install flask這樣百分百用的是當(dāng)前Python解釋器對(duì)應(yīng)的pip。因?yàn)閜ython -m pip會(huì)把pip綁定到當(dāng)前選中的解釋器而直接的pip命令則依賴PATH解析容易被其他環(huán)境干擾。IDE里選錯(cuò)了解釋器。比如PyCharm里項(xiàng)目解釋器還指向系統(tǒng)的Python而命令行里你確實(shí)激活了venv那兩邊行為就不一致。IDE配置和命令行最好統(tǒng)一指向同一個(gè).venv。排查口訣很簡單誰知道當(dāng)前python是哪個(gè)誰就決定包裝在哪。4. 虛擬環(huán)境遷移與復(fù)制按場景選擇方案4.1 為什么不能直接把venv文件夾拷走很多人會(huì)想既然venv是一個(gè)目錄那我直接壓縮、拷貝到另一臺(tái)電腦是不是就能復(fù)用環(huán)境答案是否定的。原因有三路徑硬編碼。pyvenv.cfg里的home寫死了創(chuàng)建時(shí)的Python路徑換一臺(tái)電腦路徑肯定對(duì)不上。雖然某些版本的Python會(huì)自動(dòng)重新定位但第三方包里的許多腳本、shebang行、配置文件都帶著原始絕對(duì)路徑遷移后極易報(bào)錯(cuò)。Windows的符號(hào)依賴。Windows下venv的python.exe會(huì)關(guān)聯(lián)當(dāng)前Python版本的DLL和程序集直接拷貝到?jīng)]有同樣Python版本的機(jī)器上解釋器根本無法工作。編譯產(chǎn)物不通用。部分包如cffi、numpy、pandas在安裝時(shí)會(huì)編譯出針對(duì)特定平臺(tái)/特定Python版本的二進(jìn)制文件。你把Windows上生成的venv拷貝到Linux無異于把蘋果切成梨子。所以結(jié)論要記牢我們遷移的是依賴不是環(huán)境本身。4.2 標(biāo)準(zhǔn)遷移流程與離線安裝標(biāo)準(zhǔn)流程分三步第一步在源環(huán)境導(dǎo)出依賴python -m pip freeze requirements.txt或者如果你維護(hù)的是頂層依賴直接把頂層依賴寫入requirements也行。第二步在新機(jī)器創(chuàng)建新的venvpython -m venv .venv激活后安裝依賴python -m pip install -r requirements.txt這是最通用的遷移方式。但如果你所在的公司內(nèi)網(wǎng)環(huán)境無法訪問公共PyPI或者急著在離線機(jī)器上部署還有個(gè)離線方案先在能聯(lián)網(wǎng)的機(jī)器上下載所有依賴到本地目錄python -m pip download -r requirements.txt -d packages/然后把整個(gè)packages目錄拷貝到目標(biāo)機(jī)器再離線安裝python -m pip install --no-index --find-linkspackages/ -r requirements.txt--no-index表示不使用在線PyPI--find-links指定本地包目錄。這樣整個(gè)過程完全不依賴外網(wǎng)。這里還有一個(gè)小技巧如果你只需要快速把當(dāng)前環(huán)境的包復(fù)制到另一臺(tái)機(jī)器的venv里并且兩臺(tái)機(jī)器同平臺(tái)、同Python版本可以用python -m pip install --requirement requirements.txt這只是把依賴裝過去不是復(fù)制venv。4.3 同機(jī)復(fù)用與多項(xiàng)目共享依賴同一個(gè)項(xiàng)目里如果需要多個(gè)相近的venv比如一個(gè)給開發(fā)用、一個(gè)給測試用不建議復(fù)制venv文件夾更好的做法是重新創(chuàng)建兩個(gè)環(huán)境然后都從同一份requirements里安裝。這樣最干凈也最容易排查。有同學(xué)會(huì)問如果只是開發(fā)用能不能所有項(xiàng)目共用同一個(gè)venv可以但這違背了隔離的初衷。一旦某個(gè)項(xiàng)目升級(jí)了大版本依賴其他項(xiàng)目就會(huì)被拖下水。所以我更推薦“每項(xiàng)目一個(gè)venv”的管理方式。如果你確實(shí)想要一個(gè)更高級(jí)的版本管理方案可以考慮先用pyenv管理Python版本再在項(xiàng)目下用venv隔離第三方依賴。版本控制交給pyenv項(xiàng)目依賴交給venv兩者配合基本覆蓋了絕大多數(shù)日常開發(fā)場景。5. 常見問題速查表與排查思路5.1 問題速查表問題現(xiàn)象最可能的原因解決建議python -m venv .venv報(bào)錯(cuò)Python組件缺失或版本不匹配重裝Python勾選venv/pip組件用py -3.10 -m venv激活PowerShell時(shí)提示禁止運(yùn)行腳本執(zhí)行策略被限制Set-ExecutionPolicy RemoteSigned -Scope CurrentUserPyCharm里選不到已創(chuàng)建的venv解釋器路徑?jīng)]指定到python.exe添加Interpreter時(shí)選擇Existing手動(dòng)定位.venv/Scripts/python.exeVSCode選不到venv解釋器目錄未被識(shí)別CtrlShiftP選擇 “Python: Select Interpreter”找.venv/Scripts/python.exe路徑含中文/空格導(dǎo)致venv執(zhí)行報(bào)錯(cuò)代碼或工具無法處理特殊字符路徑將項(xiàng)目移動(dòng)到純英文無空格路徑安裝了包但無法import解釋器選擇錯(cuò)誤import sys; print(sys.prefix)確認(rèn)當(dāng)前環(huán)境PyQt6相關(guān)報(bào)“虛擬環(huán)境未激活”當(dāng)前Python解釋器不對(duì)或包未安裝確保運(yùn)行解釋器指向venv重新安裝PyQt6到該venvDjango項(xiàng)目刪除venv后還想復(fù)用未正確清理IDE配置直接刪除.venv目錄并在IDE中移除解釋器路徑使用Miniforge/Anaconda建環(huán)境后想和venv互訪工具鏈不同入口不同conda環(huán)境用conda activatevenv用source/bin/activate二者不通用5.2 三個(gè)典型排查案例案例一PyCharm里死活找不到已創(chuàng)建的venv場景我在PyCharm 2025版本中用終端創(chuàng)建了.venv但項(xiàng)目設(shè)置里“Python Interpreter”下拉列表看不到它。原因PyCharm不會(huì)自動(dòng)掃描項(xiàng)目根目錄下的所有解釋器需要你手動(dòng)添加。而且它需要定位到具體的python.exe而不是只看.venv目錄。解決打開File-Settings-Project: xxx-Python Interpreter點(diǎn)Add Interpreter選擇Add Local Interpreter再選Existing把路徑定位到.venv/Scripts/python.exe應(yīng)用即可。案例二PyQt6在venv里報(bào)“虛擬環(huán)境未激活”場景明明已經(jīng)激活了venv也在venv里pip install PyQt6成功但一運(yùn)行程序就報(bào)“Could not find or load the Qt platform plugin”這類錯(cuò)誤甚至提示環(huán)境有問題。原因多半是運(yùn)行程序時(shí)用的Python解釋器不是venv里的那個(gè)。比如你用IDE Run按鈕運(yùn)行但I(xiàn)DE仍把系統(tǒng)Python設(shè)成了項(xiàng)目解釋器。解決檢查運(yùn)行配置里的解釋器路徑把它改成.venv/Scripts/python.exe。命令行運(yùn)行時(shí)先用where pythonWindows或which pythonLinux/macOS確認(rèn)激活有效。案例三中文用戶名路徑導(dǎo)致venv無法運(yùn)行場景用戶名是中文Python安裝在C:\Users\顧征宇\...下創(chuàng)建和激活venv都能成功但用PyCharm或某些外部工具調(diào)用.venv\Scripts\python.exe時(shí)報(bào)“cannot run program”。原因Windows的部分API以及Java等工具鏈對(duì)非ASCII路徑處理不佳生成進(jìn)程時(shí)找不到可執(zhí)行文件。解決最穩(wěn)妥的辦法是把項(xiàng)目放到全英文路徑比如D:\work\demo。如果實(shí)在無法移動(dòng)可以在項(xiàng)目根目錄下創(chuàng)建符號(hào)鏈接或Junctionmklink /J D:\demo_link C:\Users\顧征宇\Desktop\pythonproject然后通過D:\demo_link訪問項(xiàng)目解釋器路徑就變成英文了。這樣對(duì)你自己的體驗(yàn)影響最小也能規(guī)避路徑編碼問題。5.3 定位環(huán)境問題的通用三步法在我的實(shí)際排查中絕大多數(shù)venv相關(guān)問題都能用三步定位確認(rèn)當(dāng)前解釋器。執(zhí)行python -c import sys; print(sys.executable); print(sys.prefix)看輸出是否指向你期望的venv。確認(rèn)當(dāng)前pip。執(zhí)行python -m pip --version看它是否使用venv的site-packages或者python -m pip list看包列表是否對(duì)得上。確認(rèn)運(yùn)行入口。檢查IDE、腳本、快捷方式等入口指定的解釋器路徑確保不是“激活了終端但I(xiàn)DE還在用系統(tǒng)的Python”。只要這三步一致環(huán)境問題基本能解決。如果還是不對(duì)多半是路徑有特殊字符或包沖突回到前面的表格逐項(xiàng)對(duì)照即可。最后再說說我個(gè)人的習(xí)慣。我通常在項(xiàng)目根目錄固定用.venv這個(gè)名字順手寫進(jìn).gitignore。平時(shí)不管終端有沒有“(.venv)”前綴安裝依賴一律用python -m pip install這樣萬無一失。不同的項(xiàng)目都保持一項(xiàng)目一環(huán)境多項(xiàng)目共同組件全靠同一個(gè)requirements模板控制。時(shí)間久了你會(huì)發(fā)現(xiàn)venv不是花架子只有用過、踩過坑、徹底搞明白每個(gè)環(huán)節(jié)以后維護(hù)項(xiàng)目才不會(huì)在環(huán)境上耗費(fèi)生命。