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