操指南:從解壓即用到工程化避坑)
簡(jiǎn)介免安裝版Python 3.7是一項(xiàng)面向開發(fā)者的便攜式資源專為無管理員權(quán)限、需在多臺(tái)電腦間切換或希望保持項(xiàng)目環(huán)境隔離的用戶設(shè)計(jì)。整套內(nèi)容以rar壓縮包形式交付體積約84.92MB雖然平臺(tái)暫未給出文件總數(shù)與類型明細(xì)但核心價(jià)值在于可直接運(yùn)行的Python解釋器可搭配便攜IDE構(gòu)成獨(dú)立開發(fā)環(huán)境適合快速啟動(dòng)和輕量部署。Python 3.7帶來的類型注解、dataclass數(shù)據(jù)類、字典插入順序保留及解析性能優(yōu)化等特點(diǎn)對(duì)日常腳本編寫、維護(hù)大型項(xiàng)目和提升代碼可讀性都很有幫助也為后續(xù)使用Pandas做數(shù)據(jù)分析、Flask做Web開發(fā)、TensorFlow或PyTorch入門人工智能打下基礎(chǔ)。這類綠色形式既便于初學(xué)者立即上手也方便團(tuán)隊(duì)統(tǒng)一運(yùn)行時(shí)、減少配置沖突。當(dāng)前已有542人學(xué)習(xí)下載說明其在綠色免安裝、環(huán)境隔離等真實(shí)開發(fā)場(chǎng)景中具備實(shí)用價(jià)值。1. Python免安裝版解壓即用的解釋器到底解決了什么python免安裝版聽起來像個(gè)偏門需求真到用的時(shí)候才知道多救命。某次我在一臺(tái)鎖了管理員權(quán)限的辦公電腦上配環(huán)境官方安裝包彈完 UAC 窗口就卡死在權(quán)限審批上IT 的工單排到當(dāng)天下午項(xiàng)目進(jìn)度直接停擺。同組一位同事遞過來一個(gè)解壓好的 python 目錄改一下環(huán)境變量就能跑命令十分鐘后我開始裝依賴了。它解決的就是這類具體問題沒有管理員權(quán)限、要在多臺(tái)機(jī)器之間同步環(huán)境、給團(tuán)隊(duì)分發(fā)腳本工具也適合不想讓安裝器往注冊(cè)表和系統(tǒng)目錄里寫東西的長(zhǎng)期使用場(chǎng)景。下面把它的原理、配置步驟和踩過的坑一次說清。2. 免安裝版不是殘缺版便攜 Python 的目錄結(jié)構(gòu)與工作原理解讀2.1 免安裝版和官方安裝版差在哪注冊(cè)表、PATH 與解釋器定位機(jī)制官方安裝版做了什么把核心文件放進(jìn)C:\Program Files在注冊(cè)表里寫入解釋器路徑把python.exe所在目錄和Scripts目錄追加進(jìn)系統(tǒng) PATH順便注冊(cè).py文件關(guān)聯(lián)和卸載入口。這套邏輯在個(gè)人開發(fā)機(jī)上沒問題但換到受管控的辦公網(wǎng)、共享測(cè)試服務(wù)器上就變得礙手礙腳沒權(quán)限裝、裝了怕影響別人、卸載還會(huì)留殘余。免安裝版把「安裝」壓縮成「解壓」背后依賴的是 Python 3.6 之后解釋器不再把注冊(cè)表當(dāng)作路徑定位的必需項(xiàng)。具體機(jī)制是這樣的python.exe啟動(dòng)后解釋器以「自身可執(zhí)行文件所在目錄」為基準(zhǔn)去找標(biāo)準(zhǔn)庫。查找順序大致是先看同一層級(jí)下有沒有Lib\os.py這是標(biāo)準(zhǔn)庫的目錄布局再判斷根目錄下是否存在pyvenv.cfg這個(gè)文件同時(shí)服務(wù)于正式安裝版和 venv如果兩個(gè)條件都不滿足才回退到編譯期寫入的默認(rèn)路徑查找邏輯。換句話說只要整個(gè)目錄的相對(duì)結(jié)構(gòu)不被破壞把文件夾改名、挪位置都能正常啟動(dòng)。pyvenv.cfg是理解免安裝版的關(guān)鍵。它表面上是給 venv 用的配置但官方安裝器也會(huì)在普通安裝目錄里生成一份核心是下面兩行以你手頭版本實(shí)際內(nèi)容為準(zhǔn)home D:\dev\python-portable version 3.12.xhome指向這個(gè) Python 環(huán)境的“家目錄”解釋器讀到這里就確定了標(biāo)準(zhǔn)庫和site-packages的查找根。免安裝版能實(shí)現(xiàn)解壓即用靠的就是這個(gè)自定位機(jī)制不是什么玄學(xué)。理解這點(diǎn)之后下面看目錄里有哪些東西必須存在。2.2 一份能跑的免安裝版目錄里必須有什么文件級(jí)清單與缺失后果拿到壓縮包別急著解壓先打開看看目錄結(jié)構(gòu)。一份能正常工作的免安裝版 Python核心成員和它們各自的作用如下表目錄 / 文件作用缺失時(shí)的影響python.exe主解釋器入口命令行和腳本都靠它整個(gè)環(huán)境不可用pythonw.exe無控制臺(tái)窗口的入口GUI 腳本用GUI 程序會(huì)帶出一個(gè)黑色命令行窗口DLLs\擴(kuò)展模塊的.pyd和依賴 DLLimport某些模塊時(shí)報(bào)ModuleNotFoundError或DLL load failedLib\標(biāo)準(zhǔn)庫的純 Python 代碼解釋器啟動(dòng)后找不到os、sys等基礎(chǔ)模塊Lib\site-packages\第三方包的實(shí)際安裝位置pip install后無落點(diǎn)Scripts\pip.exe等命令行工具敲pip提示不是內(nèi)部或外部命令pyvenv.cfg記錄 home 與版本信息目錄挪動(dòng)后解釋器定位失效tcl\tkinter 依賴的 Tcl/Tk 運(yùn)行時(shí)import tkinter直接報(bào)錯(cuò)需要區(qū)分一個(gè)容易混淆的東西官方發(fā)布頁里還有一類embeddable package壓縮包解壓后只有python.exe、python3xx.dll、python3xx.zip和vcruntime140.dll沒有Lib目錄也沒有Scripts。那個(gè)包是設(shè)計(jì)給別的程序內(nèi)嵌用的不是當(dāng)日常解釋器用的。拿它當(dāng)免安裝版用會(huì)踩后面避坑章節(jié)里說的 pip 缺失問題。判斷標(biāo)準(zhǔn)很簡(jiǎn)單目錄里同時(shí)有Lib和Scripts的才是真正意義的免安裝版。2.3 包管理也“隨身走”site-packages 與 Scripts 的便攜特性免安裝版最被看重的特性是第三方包跟著目錄走。pip install默認(rèn)把包文件放進(jìn)Lib\site-packages把命令行入口生成到Scripts目錄整個(gè)過程都在這個(gè)根目錄內(nèi)完成不涉及系統(tǒng)目錄。這意味著在一臺(tái)機(jī)器上把依賴裝齊整個(gè)文件夾壓縮后帶到另一臺(tái)機(jī)器包還在。但這有個(gè)前提site-packages里不是所有東西都能承受搬家。部分包安裝時(shí)會(huì)留下.pth文件里面寫的是絕對(duì)路徑還有的包會(huì)生成指向源碼目錄的egg-link。目錄挪動(dòng)后這些機(jī)制指向的位置變了包就會(huì)import失敗具體表現(xiàn)和修復(fù)方法我在第 5 章展開。先把原理層面的認(rèn)識(shí)立住免安裝版的便攜性來自目錄自包含但第三方包安裝時(shí)產(chǎn)生的外部引用會(huì)破壞這個(gè)自包含這是后續(xù)所有坑的根源。3. 從解壓到 pip 可用目錄規(guī)劃、三條驗(yàn)證命令與鏡像配置3.1 解壓與目錄規(guī)劃路徑里的空格和中文都是隱患先把免安裝版放到一個(gè)規(guī)矩的位置。我一般放在盤符根目錄下的dev文件夾里比如D:\dev\python-portable。為什么強(qiáng)調(diào)這個(gè)兩個(gè)原因第一路徑帶空格時(shí)后續(xù)在批處理腳本里拼接 PATH 容易出引號(hào)配對(duì)問題第二部分 C 擴(kuò)展在編譯時(shí)記錄了絕對(duì)路徑如果路徑里帶中文或特殊字符跨目錄調(diào)用 DLL 時(shí)可能出現(xiàn)搜索失敗。省事做法就是全部用 ASCII 路徑目錄層級(jí)不超過三層。解壓這一步Windows 10 以上系統(tǒng)自帶tar命令可以直接用cd /d D:\dev mkdir python-portable tar -xf python-portable.tar.gz -C python-portable邏輯說明-C參數(shù)指定解壓目標(biāo)目錄mkdir先建好目錄是為了避免解壓時(shí)直接散落一堆文件到D:\dev下面。如果拿到的是.7z壓縮包用 7-Zip 解壓效果更穩(wěn)右鍵解壓到當(dāng)前目錄即可。解壓完成后補(bǔ)一條目錄結(jié)構(gòu)確認(rèn)tree /f /a D:\dev\python-portable | more邏輯說明/f顯示文件、/a用純文本字符畫樹more做分頁。重點(diǎn)看兩層根目錄下是否有python.exe和LibLib下是否有site-packages。只要這三樣都在這個(gè)免安裝版的基礎(chǔ)就是完整的。3.2 驗(yàn)證解釋器與 pip三條命令確認(rèn)環(huán)境沒被污染解壓完先別急著跑腳本用三條命令做體檢。注意這里強(qiáng)調(diào)用全路徑調(diào)python.exe目的是繞過系統(tǒng) PATH 里可能存在的其他 Python 環(huán)境cd /d D:\dev\python-portable python.exe --version python.exe -c import sys; print(sys.executable) python.exe -m pip --version邏輯說明第一行確認(rèn)解釋器版本第二行輸出sys.executable如果打印出來的路徑是D:\dev\python-portable\python.exe說明當(dāng)前窗口用的就是這個(gè)免安裝環(huán)境而不是 PATH 里靠前的系統(tǒng) Python第三行用-m pip而不是直接敲pip.exe是因?yàn)?m方式不依賴Scripts目錄是否在 PATH 里只要解釋器本身可用pip 一定能被找到。參數(shù)說明-c后面跟的是要執(zhí)行的 Python 代碼import sys拿解釋器運(yùn)行時(shí)信息print(sys.executable)輸出當(dāng)前解釋器的絕對(duì)路徑。這一步如果輸出的路徑不是你解壓的那個(gè)目錄說明有環(huán)境變量串臺(tái)下面的配置步驟要在修正這個(gè)基礎(chǔ)之后再做。3.3 配置 pip 鏡像與驗(yàn)證安裝pip.ini 的正確落點(diǎn)免安裝版剛解壓出來pip 默認(rèn)走官方 PyPI 源。國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下裝大一點(diǎn)的包經(jīng)常超時(shí)這一步把鏡像源寫到用戶級(jí)配置文件里一勞永逸。pip 的用戶級(jí)配置文件在%APPDATA%\pip\pip.ini沒有就手動(dòng)建[global] index-url http://mirror-host/pypi/simple trusted-host mirror-host timeout 60參數(shù)說明index-url是包下載源地址mirror-host替換成你們內(nèi)網(wǎng)或你所在網(wǎng)絡(luò)環(huán)境下實(shí)測(cè)速度最快的鏡像源建議用內(nèi)網(wǎng)自建的私有 PyPI 源安全和速度都有保障trusted-host是讓 pip 放行該主機(jī)的非 HTTPS 訪問如果你的源是 HTTPS 且有受信證書這行可以刪掉timeout單位是秒設(shè) 60 是給慢速網(wǎng)絡(luò)留余量。配好之后驗(yàn)證兩件事python.exe -m pip config list python.exe -m pip install requests --dry-run邏輯說明pip config list確認(rèn)配置是否被讀到輸出里應(yīng)該能看到global.index-url那行--dry-run表示只解析依賴、下載元數(shù)據(jù)但不動(dòng)本地環(huán)境用來驗(yàn)證源是否連通??吹筋愃芖ould install requests-2.x.x的輸出說明解釋器、pip、鏡像源三者已經(jīng)打通這個(gè)免安裝環(huán)境可以正式服役了。4. 進(jìn)階用法臨時(shí)環(huán)境變量、venv 隔離與多機(jī)分發(fā)4.1 不碰系統(tǒng) PATH 的啟動(dòng)方式bat 腳本里的臨時(shí)環(huán)境變量直接用全路徑調(diào)python.exe寫起來累把目錄加進(jìn)系統(tǒng) PATH 又污染全局。折中的做法寫一個(gè)批處理腳本雙擊后開一個(gè)帶臨時(shí)環(huán)境變量的窗口。腳本內(nèi)容如下echo off set PYTHON_HOME%~dp0 set PATH%PYTHON_HOME%;%PYTHON_HOME%\Scripts;%PATH% set PYTHONUTF81 cmd /k邏輯說明%~dp0是批處理腳本自身所在目錄帶結(jié)尾反斜杠這樣腳本無論放在哪個(gè)位置、整個(gè)目錄怎么挪動(dòng)都能正確定位到 Python 根目錄PATH前面拼接PYTHON_HOME和Scripts保證python和pip都優(yōu)先命中這個(gè)目錄PYTHONUTF81是讓 Python 在 Windows 下默認(rèn)按 UTF-8 處理標(biāo)準(zhǔn)輸入輸出print 中文不亂碼cmd /k表示執(zhí)行完這些設(shè)置后保持在命令提示符窗口不自動(dòng)關(guān)閉。保存這個(gè)文件時(shí)有個(gè)細(xì)節(jié).bat文件編碼要用 ANSI/GBK 保存注釋里的中文才不會(huì)亂碼。如果嫌麻煩注釋部分全部用英文寫也行。這樣處理之后系統(tǒng) PATH 永遠(yuǎn)是干凈的這個(gè)免安裝版只在你自己打開的窗口里生效不會(huì)影響機(jī)器上其他項(xiàng)目對(duì) Python 版本的選擇。4.2 項(xiàng)目隔離用 venv讓免安裝版本體保持干凈免安裝版的目錄是隨身帶的如果所有項(xiàng)目都往它的site-packages里塞包時(shí)間一長(zhǎng)依賴關(guān)系攪成一團(tuán)換機(jī)器、升級(jí)版本都很難收?qǐng)觥N乙话憬o它固定配一套 venv 工作流免安裝版本身只保留 pip、setuptools 這類基礎(chǔ)工具每個(gè)項(xiàng)目獨(dú)立建虛擬環(huán)境。python.exe -m venv D:\workspace\project-a\.venv D:\workspace\project-a\.venv\Scripts\activate pip install flask邏輯說明第一行在項(xiàng)目目錄下創(chuàng)建虛擬環(huán)境python.exe -m venv會(huì)生成一個(gè)包含獨(dú)立site-packages和環(huán)境啟動(dòng)腳本的.venv目錄第二行執(zhí)行激活腳本激活后當(dāng)前窗口的python、pip都指向虛擬環(huán)境第三行安裝項(xiàng)目依賴產(chǎn)物落在項(xiàng)目自己的虛擬環(huán)境里不碰免安裝版本體。參數(shù)說明.venv是目錄名按團(tuán)隊(duì)?wèi)T例統(tǒng)一叫這個(gè)名字方便寫.gitignore如果機(jī)器上同時(shí)有多個(gè)物理機(jī)的項(xiàng)目建議project-a這類目錄名里帶上明確的業(yè)務(wù)標(biāo)識(shí)避免以后找不到是誰的項(xiàng)目。順帶提一個(gè)很多人踩過的坑venv 創(chuàng)建時(shí)會(huì)往.venv\Scripts下生成python.exe啟動(dòng)器這個(gè)啟動(dòng)器指向的是創(chuàng)建它時(shí)那個(gè)基礎(chǔ)解釋器的絕對(duì)路徑。目錄挪動(dòng)之后虛擬環(huán)境會(huì)失效解法是刪掉重建而不是試圖手動(dòng)改路徑。4.3 多機(jī)分發(fā)拷貝目錄、依賴快照與“不要拷 venv”的紀(jì)律給團(tuán)隊(duì)或者跨機(jī)器分發(fā)環(huán)境標(biāo)準(zhǔn)動(dòng)作是「免安裝版目錄 requirements.txt」。源機(jī)器上先生成依賴清單python.exe -m pip freeze requirements.txt邏輯說明pip freeze會(huì)列出當(dāng)前環(huán)境所有已安裝包和精確版本號(hào)重定向到requirements.txt。需要留意一個(gè)坑如果某些包是通過本地路徑或 VCS 裝的freeze輸出里會(huì)帶file:///...或git開頭的行目標(biāo)機(jī)器上執(zhí)行pip install -r時(shí)可能直接報(bào)錯(cuò)。這種時(shí)候需要手動(dòng)把這幾行改成正常的包名或指定一個(gè)可訪問的源。目標(biāo)機(jī)器上拿到壓縮包后解壓、按第 3 章的方法配好鏡像然后執(zhí)行恢復(fù)命令python.exe -m pip install -r requirements.txt參數(shù)說明-r指定依賴清單文件路徑。恢復(fù)完成后跑一遍python.exe -m pip check這一步會(huì)校驗(yàn)已安裝包的依賴是否齊全比人工逐個(gè)import快得多。分發(fā)時(shí)有一條硬紀(jì)律不要整個(gè)打包 venv 目錄跨機(jī)器拷貝。虛擬環(huán)境內(nèi)部的腳本和配置記錄的是創(chuàng)建時(shí)的絕對(duì)路徑換機(jī)器必掛而且排查起來非常繞。正確姿勢(shì)是拷貝干凈的基礎(chǔ)環(huán)境加依賴清單到新機(jī)器重新建 venv 再恢復(fù)依賴。5. 免安裝版避坑指南六類高頻翻車現(xiàn)場(chǎng)與排查思路5.1 import tkinter 報(bào)錯(cuò)Tcl/Tk 被裁掉的代價(jià)現(xiàn)象執(zhí)行import tkinter直接拋ModuleNotFoundError但site-packages里其他包一切正常。原因部分免安裝壓縮包為了控制體積把tcl目錄和DLLs\_tkinter.pyd從包里剔除掉了。解釋器本身能跑但 GUI 相關(guān)的標(biāo)準(zhǔn)庫模塊不完整。解決先確認(rèn)缺什么檢查DLLs目錄下有沒有_tkinter.pyd、根目錄下有沒有tcl文件夾。缺哪個(gè)就從同版本官方安裝版里把對(duì)應(yīng)文件拷出來放到同樣位置。補(bǔ)完之后重新打開命令行再試import tkinter能過就成了。5.2 敲 pip 提示“不是內(nèi)部或外部命令”Scripts 目錄沒進(jìn) PATH現(xiàn)象python.exe -m pip --version輸出正常但直接敲pip報(bào)pip 不是內(nèi)部或外部命令。原因pip.exe存在于Scripts目錄下但該目錄不在當(dāng)前窗口的 PATH 里。免安裝版默認(rèn)不修改系統(tǒng) PATH所以這個(gè)現(xiàn)象不是缺失是沒暴露入口。解決日常全部統(tǒng)一用python -m pip的調(diào)用方式如果一定要用pip短命令回到第 4 章的 bat 腳本方案把Scripts目錄加進(jìn)窗口級(jí) PATH。不建議手動(dòng)往系統(tǒng) PATH 里塞免安裝版的路徑一旦目錄挪動(dòng)會(huì)留下一堆失效引用。5.3 換機(jī)器后閃退或 0xc000007bVC 運(yùn)行庫與位數(shù)對(duì)齊現(xiàn)象在 A 機(jī)器上一切正常整個(gè)目錄打包到 B 機(jī)器后雙擊python.exe窗口閃一下就沒了或者彈出0xc000007b、找不到 VCRUNTIME140.dll這類錯(cuò)誤。原因Python 解釋器本體依賴 VC 運(yùn)行庫精簡(jiǎn)版通常不攜帶vcruntime140.dll、vcruntime140_1.dll、msvcp140.dll這幾個(gè)文件。目標(biāo)機(jī)器缺運(yùn)行庫時(shí)解釋器起不來。解決最省事的做法是把這幾個(gè) DLL 直接放進(jìn)免安裝版根目錄跟python.exe放一起。注意位數(shù)必須對(duì)齊64 位解釋器配 64 位 DLL混放必報(bào)0xc000007b。有條件的話在目標(biāo)機(jī)器上裝一遍 VC 2015-2022 Redistributable x64 運(yùn)行庫一勞永逸。5.4 目錄搬家后第三方包失效site-packages 里的絕對(duì)路徑現(xiàn)象整個(gè)目錄從D:\dev\python-portable挪到E:\tools\python之后解釋器和標(biāo)準(zhǔn)庫正常但之前 pip 裝的第三方包有些import直接報(bào)錯(cuò)。原因部分包安裝時(shí)生成了寫死絕對(duì)路徑的.pth文件或egg-link目錄位置一變化解釋器按舊路徑找包自然撲空。解決優(yōu)先重裝受影響包python.exe -m pip install --force-reinstall 包名重新生成鏈接文件如果壞得太多直接備份Lib\site-packages后清空再按第 4 章的依賴清單整體重裝一遍。經(jīng)歷過一次之后我養(yǎng)成了隨手在requirements.txt里記錄依賴的習(xí)慣搬遷時(shí)從不用賭運(yùn)氣。5.5 python.exe 被安全軟件隔離加白名單與來源校驗(yàn)現(xiàn)象解壓后隔幾天發(fā)現(xiàn)python.exe不見了或啟動(dòng)時(shí)報(bào)“找不到指定模塊”打開安全中心的隔離區(qū)能看到python.exe的隔離記錄。原因免安裝版沒有數(shù)字簽名流程加持目錄里又是大量可執(zhí)行文件和 DLL啟發(fā)式掃描容易把它們當(dāng)潛在威脅尤其是從網(wǎng)盤、群聊里流出的打包版本特征更容易被命中。解決解壓后在安全中心把整個(gè)目錄加進(jìn)白名單然后立刻執(zhí)行一次python.exe --version做健康檢查。解壓工具本身建議用 7-Zip 官方無捆綁版本不要用下載站點(diǎn)里那種帶“高速解壓”字樣的集成工具避免壓縮包在解壓環(huán)節(jié)就被動(dòng)了手腳。5.6 embeddable 包裝不了 pip兩個(gè)特征認(rèn)清身份現(xiàn)象解壓后目錄里沒有Lib也沒有Scripts執(zhí)行python.exe -m pip提示No module named pip。原因拿的是官方embeddable package那不是給人當(dāng)日常解釋器用的標(biāo)準(zhǔn)庫被壓縮進(jìn)了python3xx.zippip 默認(rèn)沒整合進(jìn)去。解決先看目錄里有沒有python3xx.zip和python3xx.dll有這兩個(gè)特征基本可以斷定是 embeddable 版。兩個(gè)選擇換成真正的免安裝版或者硬補(bǔ) pip下載get-pip.py后執(zhí)行python.exe get-pip.py再把目錄下python3xx._pth文件里import site一行的注釋符號(hào)去掉否則 pip 裝完也會(huì)因?yàn)閟ite未加載而不可用。6. 把免安裝版變成自己的工具鏈一鍵初始化與依賴快照6.1 init.bat一條命令完成鏡像、升級(jí)與環(huán)境自檢免安裝版換了機(jī)器要重復(fù)做鏡像配置和 pip 升級(jí)步驟固定但瑣碎。我習(xí)慣在根目錄放一個(gè)init.bat把初始化動(dòng)作串成一條命令echo off set PYTHON_HOME%~dp0 set PATH%PYTHON_HOME%;%PYTHON_HOME%\Scripts;%PATH% python.exe -m pip config set global.index-url http://mirror-host/pypi/simple python.exe -m pip install --upgrade pip python.exe -m pip check cmd /k邏輯說明前兩行復(fù)用第 4 章的臨時(shí)環(huán)境變量方案然后依次是配置鏡像源、升級(jí) pip、執(zhí)行依賴完整性檢查。pip check這一步很有價(jià)值它會(huì)把環(huán)境中所有已裝包的依賴缺失列出來相當(dāng)于給整個(gè)環(huán)境做了一次體檢比逐個(gè)跑import快得多。腳本跑完后窗口保持打開直接能看到三項(xiàng)命令的輸出結(jié)果。6.2 依賴快照與恢復(fù)pip freeze 的坑和替代方式pip freeze生成的清單里如果是干凈版本號(hào)列表恢復(fù)非常順利但如果里面有file:///或git行目標(biāo)機(jī)器執(zhí)行會(huì)失敗。我補(bǔ)包前的習(xí)慣是先手工把這類行改成正式包名再重新生成一次requirements.txt。如果項(xiàng)目里混著多個(gè)環(huán)境可以用pipreqs這類工具掃描項(xiàng)目導(dǎo)入語句生成精簡(jiǎn)清單只保留代碼真正用到的依賴恢復(fù)速度更快也少裝一堆用不上的包。6.3 小版本升級(jí)時(shí)的 site-packages 遷移免安裝版做小版本升級(jí)時(shí)不必重裝所有第三方包。新版本解壓到新目錄后把舊目錄的Lib\site-packages整體拷過去然后執(zhí)行一次python.exe -m pip install --upgrade --upgrade-strategy only-if-needed pip setuptools讓基礎(chǔ)工具對(duì)齊新解釋器。這一步之后跑pip check如果報(bào)依賴錯(cuò)誤說明有包需要按新版本重新編譯逐個(gè)--force-reinstall重裝即可。跨大版本升級(jí)不推薦這種拷貝法C 擴(kuò)展的二進(jìn)制兼容性在大版本間不保證。從那以后我在陌生機(jī)器上搭 Python 環(huán)境一律先拷一份免安裝版過去跑完init.bat再用pip check確認(rèn)環(huán)境干凈才開始裝業(yè)務(wù)依賴。這套流程省下過好幾次在權(quán)限審批和 DLL 報(bào)錯(cuò)里來回折騰的時(shí)間希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取