VS Code 无法运行 Activate.ps1:先区分 PowerShell 策略与 Python 环境
VS Code 的 Activate.ps1 被 PowerShell 策略阻止,直接检查环境解释器,按终端与组策略选择激活方式,临时设置可恢复。
在 VS Code 的 Windows 终端运行 .\.venv\Scripts\Activate.ps1,提示 running scripts is disabled on this system,但改用 cmd 可以激活。这通常是 PowerShell 拒绝执行脚本,不表示虚拟环境里的 Python 已经损坏。
先确认环境解释器能否直接运行,再决定是否需要改变终端或脚本策略。激活只是方便使用环境中的命令,并非使用 venv 的必要步骤。以下针对 Windows 的 Python 标准 venv;公司设备的组策略需要按管理员要求处理。
先绕过激活步骤,确认解释器
在项目目录中执行只读检查,.venv 应换成已有环境的实际目录:
.\.venv\Scripts\python.exe -c "import sys; print(sys.executable); print(sys.prefix); print(sys.base_prefix)"
.\.venv\Scripts\python.exe -m pip --version
解释器和 pip 应指向该环境,标准 venv 中 sys.prefix 与 sys.base_prefix 应不同。若这两条能运行,而 Activate.ps1 被策略阻止,可以直接使用完整解释器路径启动程序或调用模块,不必为此重建环境。
路径不存在、Python 本身无法启动或基础解释器已被移除,则属于环境文件问题。脚本策略放宽后也不能恢复缺失的解释器,应先解决那个错误。
VS Code 的 Python 解释器选择与终端激活也是两个环节。核对编辑器实际选择的是这个环境;终端报错消失不保证调试器与任务使用了同一解释器。
用 cmd 时,要新建对应终端
如果无需 PowerShell 功能,可在 VS Code 中选择终端默认配置文件为 Command Prompt,并新建终端。在 cmd 内使用对应脚本:
.venv\Scripts\activate.bat
更改默认配置文件不会把已经打开的 PowerShell 终端变成 cmd。在 PowerShell 中启动子进程执行 activate.bat,也不能把子进程的环境变量自动带回原终端。应确认当前终端类型,再使用它对应的激活脚本。
需要 PowerShell 激活时,只调整获准的范围
先查看当前有效策略和各范围的设置:
Get-ExecutionPolicy
Get-ExecutionPolicy -List
MachinePolicy 和 UserPolicy 来自组策略,优先级高于当前进程设置。它们限制脚本执行时,不要通过反复设置 Bypass 或永久放宽整个机器来绕过管理规则;可以继续使用获准的解释器路径,或请管理员确认适用办法。
对于自己管理的开发机,已确认脚本是本机可信 Python 创建的激活脚本,且允许执行这类脚本时,可以只为当前 PowerShell 进程设置 RemoteSigned:
$venvPreviousPolicy = Get-ExecutionPolicy -Scope Process
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
.\.venv\Scripts\Activate.ps1
该设置不写成永久用户或机器配置,作用持续到当前进程及其相关子进程关闭。组策略仍可能使有效策略保持不变,因此修改后应再查看实际有效值,而不只看设置命令是否成功。
RemoteSigned 不等于允许任意脚本。带有互联网来源标记的未签名脚本仍可能被拒绝;应核对来源和组织规则,不能为陌生下载文件直接批量解除阻止。持续需要用户范围策略时,应按既定开发机配置管理,不必为一次激活修改 LocalMachine。
验证并恢复临时设置
激活后检查当前命令解析与运行结果:
Get-Command python
python -c "import sys; print(sys.executable)"
两者应指向预期的虚拟环境。随后用项目既有的检查任务确认依赖可用;终端提示符出现环境名本身不足以证明选择正确。
如果要在同一个终端恢复此前的进程策略,可以使用已记录的值:
Set-ExecutionPolicy -ExecutionPolicy $venvPreviousPolicy -Scope Process
退出并关闭相关 PowerShell 进程也会结束这项临时设置。恢复策略不会删除 venv,也不会卸载包;若此前误改过 CurrentUser 或 LocalMachine,需要按修改前记录分别恢复,不能假定关闭窗口就撤销了永久设置。


