Windows 下 .venv 激活腳本深度定制:同時注入 PyTorch 調試日志與國內網絡加速通道
——從“能跑”到“好調”的完整工程化方案
一、為什么非得改激活腳本?
-
重復勞動最耗時
每次打開終端都要敲四五行 set/export,人腦就是不可靠的剪貼板。 -
環境隔離最怕“漏刪”
手動 set 的全局變量在關閉終端前一直存在,極易在下一個項目里造成版本沖突。 -
團隊協作最怕“不一致”
新人克隆代碼后,因為少配一個變量,導致同樣的腳本別人能跑他報錯。
把配置寫進activate.*
后,以上三件事一次性解決:進入 .venv 自動加載,退出 .venv 自動卸載,腳本隨倉庫同步,CI 也能直接復現。
二、核心原理:activate 到底做了什么?
activate.bat
只做三件小事:
-
把
Scripts
目錄插到 PATH 最前; -
設置
VIRTUAL_ENV
變量,方便 pip 裝包時找對位置; -
在 CMD 里定義一個
deactivate
函數,用于回退 PATH 與變量。
PowerShell 版同理,只是語法換成 $env:
。
因此“追加自定義變量”不會破壞原有邏輯,只要保證在文件末尾插入、并用 deactivate
時自動清除即可。官方腳本已經幫我們寫好了“變量回退”邏輯,我們只需追加。
三、一步一步動手改
-
創建純凈 .venv
python -m venv .venv
建議把 venv 目錄寫進
.gitignore
,但把activate-custom.bat
與activate-custom.ps1
模板保存到/scripts
并入庫,方便團隊一鍵覆蓋。
? -
備份官方腳本
復制一份activate.bat
→activate-backup.bat
,萬一改崩可回滾。
? -
追加 PyTorch 調試段
在activate.bat
末尾加入::: ===== PyTorch 調試日志 ===== set "TORCH_LOGS=+dynamo,+aot,+graph,+output_code" set "TORCHDYNAMO_VERBOSE=1" :: 想看 C++ 端棧幀再打開下一行 :: set "TORCH_SHOW_CPP_STACKTRACES=1"
說明:
-
+dynamo
是最小可用集合; -
若做
torch.compile
性能調優,可再追加+aot
與+graph
; -
變量值用雙引號包裹,防止路徑含空格崩潰。
?
-
-
追加網絡加速段
國內場景分兩種:-
已有本地加速工具(C****、v2****)→ 直接指到回環端口;
-
無工具 → 把
https_proxy
指向清華/阿里 PyPI 鏡像域名,走“鏡像+代理”混合模式。
示例:
:: 本地工具監聽 7897 set "http_proxy=http://127.0.0.1:7897" set "https_proxy=http://127.0.0.1:7897" :: 若用鏡像,可再寫一行 set "PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple"
注意:
-
端口與工具側配置保持一致;
-
如果公司內網有自簽證書,再加
set "PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn"
。
?
-
-
PowerShell 版對稱改造
打開activate.ps1
末尾:# ===== PyTorch 調試日志 ===== $env:TORCH_LOGS = "+dynamo,+aot,+graph" $env:TORCHDYNAMO_VERBOSE = "1"# ===== 網絡加速 ===== $env:http_proxy = "http://127.0.0.1:7897" $env:https_proxy = "http://127.0.0.1:7897" $env:PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"
友情提示:PowerShell 執行策略默認禁止腳本,需先
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
-
讓“退出”時自動清理
官方deactivate
函數已經幫我們set
回空值,無需額外操作;
若你追加了自己獨創的變量,例如MY_PROJ_DEBUG=1
,記得在deactivate
里加一行:set MY_PROJ_DEBUG=
否則下次再進別的 .venv 會殘留。
?
四、驗證:一次打通“調試+下載”
-
調試端驗證
寫一個最小demo.py
:import torch @torch.compile def foo(x): return x * 2 foo(torch.randn(2,2))
運行后應看到
[DEBUG] torch._dynamo.eval_frame.__call__: dynamo debug log
字樣,說明變量生效。 -
下載端驗證
python -m pip install --upgrade pip setuptools wheel
若控制臺出現
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
且下載速度≥ 5 MB/s,即成功。 -
快速排錯表
現象 最可能原因 1 分鐘自查 pip 仍超時 代理端口錯/工具未啟動 `netstat -ano findstr 7897` 看監聽 無調試日志 變量沒載入 echo %TORCH_LOGS%
?是否為空PS 報錯“無法加載腳本” 執行策略受限 Get-ExecutionPolicy -List
?查看
五、高階玩法:多環境差異化配置
-
同倉庫多版本
項目同時維護torch1.13
、torch2.2
兩個分支,可建兩個 venv:venv113\Scripts\activate.bat venv220\Scripts\activate.bat
各自腳本里寫死不同
PIP_INDEX_URL
與TORCH_LOGS
,切換分支即切換環境,永不串擾。 -
一條命令生成“完全體”
把改造過程寫成setup_venv.py
:import venv, subprocess, shutil, textwrap builder = venv.EnvBuilder(with_pip=True) builder.create('venv') # 追加片段 patch = textwrap.dedent(r'''set "TORCH_LOGS=+dynamo"set "https_proxy=http://127.0.0.1:7897" ''') with open('venv/Scripts/activate.bat','a',encoding='utf-8') as f:f.write('\n'+patch)
新人入職只需:
python setup_venv.py .\venv\Scripts\activate
-
CI/CD 也復用
yaml
GitHub Actions 里加一步:- name: Patch venv activaterun: |cat scripts/activate-append.txt >> venv/Scripts/activate.bat
保證云端日志級別與本地一致,debug 不再“只能本地復現”。
六、安全與合規小貼士
不要把真實賬號密碼寫進代理地址,例如 http://user:pass@ip:port
,極易被掃到。
若公司內網已有統一出口,優先使用內部 Artifactory 或 Nexus,而不是各自配代理。
腳本里只留“可公開”的鏡像域名,敏感端口用 127.0.0.1
,防止被外部掃描。
七、總結:把“環境”也當成代碼
激活腳本也是源代碼,應當:
入庫:模板放 /scripts
,README 寫明如何覆蓋;
評審:MR 階段就檢查新增變量是否必要;
自動化:一鍵腳本 + CI 校驗,保證任何時刻 git clone → setup → run
都能跑通。
當我們把調試日志、網絡加速、甚至 CUDA_VISIBLE_DEVICES
全部固化進激活腳本后,
就會發現——
“在我電腦能跑”終于不再是玄學,而是工程常識。祝調試愉快,日志常亮!
八、參考文獻
venv --- 虛擬環境的創建
在Windows上使用 Python
PyTorch 文檔
Lib/venv/scripts/nt/activate.bat
學習 Windows服務器 Windows命令 set (環境變量)
學習 PowerShell about_Environment_Variables
Welcome to the PyTorch developer's wiki!
介紹如何創建和使用PowerShell配置文件
Lib/venv/__init__.py
使用pip和venv在虛擬環境中安裝軟件包