PAYATHON 2026

Windows 11 上 VS Code 显示 venv 已激活,为何 py 仍使用全局 Python?

数据阿明

终端中的 (.venv) 和 VS Code 状态栏都不能单独证明 py 最终启动了虚拟环境中的 Python。你的检测结果表明,这次通过 py 启动的解释器没有运行在标准 venv 环境中,但目前还无法确定具体原因。可以先直接调用 .venv 中的 python.exe 安装 nodeenv,再检查终端激活和命令解析情况。

为什么 Get-Command py 返回全局路径不代表激活失败?

Windows 上的 py 通常是 Python 启动器。Get-Command py 查到的是启动器自身的位置,启动器随后还会选择一个 Python 解释器。因此,即使虚拟环境工作正常,py 自身也可能位于全局目录。

py 也并非总会忽略虚拟环境。对于实现了虚拟环境识别的传统 Windows Python Launcher,如果没有显式指定 Python 版本,且启动器正确识别到了活动虚拟环境,就会使用该环境的解释器。这个机制会检查 VIRTUAL_ENV。参见 PEP 486。

要确认实际使用的解释器,需要查看 sys.executable,而不能只看 py 的路径。

先直接使用虚拟环境安装 nodeenv

以下命令假设当前 PowerShell 位于项目根目录,且虚拟环境目录名为 .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

检查以下信息:

  • sys.executable 应指向项目的 .venv\Scripts\python.exe。
  • 对于正常的标准 venv,sys.prefix 与 sys.base_prefix 应不同。
  • pip --version 显示的 pip 路径通常应位于该 .venv 内。

确认后安装并检查包的位置:

.\.venv\Scripts\python.exe -m pip install nodeenv
.\.venv\Scripts\python.exe -m pip show nodeenv

正常情况下,默认安装位置应在项目的 .venv\Lib\site-packages 下,具体以 pip show 输出的 Location 为准。直接指定解释器路径无需激活终端,Python venv 文档也说明了这种使用方式。

如果直接执行该解释器就报错,或两个 prefix 仍然相等,先检查 .venv\pyvenv.cfg 是否存在,以及虚拟环境是否被移动、复制过,或失去了对应的基础 Python 安装。反复切换 VS Code 的解释器选择无法代替这些检查。

重新激活终端,比较 python 与 py

在 VS Code 中执行 Python: Select Interpreter,选择项目的 .venv\Scripts\python.exe,然后关闭原来的集成终端,新建一个 PowerShell 终端。解释器选择和已有终端的状态需要分别检查;VS Code 是否自动激活终端还受扩展设置影响。参见 VS Code Python 设置说明。

在新终端中显式激活:

.\.venv\Scripts\Activate.ps1

随后执行:

$env:VIRTUAL_ENV
Get-Command python -All
Get-Command py -All
python -c "import sys; print(sys.executable); print(sys.prefix == sys.base_prefix)"
py -c "import sys; print(sys.executable); print(sys.prefix == sys.base_prefix)"

sys.prefix == sys.base_prefix 用于检查当前 Python 进程是否使用标准虚拟环境。返回 False 表示正在使用虚拟环境,但还需要结合 sys.executable 确认是否为目标 .venv。Python 文档说明了这一判断方法。

根据输出继续处理:

  • 如果 python 指向项目环境,而 py 指向全局环境,检查 Get-Command py -All 是否显示了同名函数、别名或其他启动器。暂时使用已确认正确的 python -m pip,或继续使用解释器的完整路径。
  • 如果两者都指向全局环境,检查激活脚本是否报错,以及 Get-Command python -All 是否显示了优先匹配的别名、函数或其他程序。
  • 如果两者都正确,但 nodeenv 的位置仍异常,继续检查 pip 的安装配置。
.\.venv\Scripts\python.exe -m pip config debug
Get-ChildItem Env:PIP*

查看是否配置了会改变安装目标的 target、prefix、user,或对应的 PIP_TARGET、PIP_PREFIX、PIP_USER 环境变量。根据实际输出调整配置,不能仅凭提示符判断安装位置。

Azure Function 是否会影响这个问题?

目前没有证据表明故障由 Azure Function 引起。先让普通集成终端中的解释器检查和安装结果一致。

如果终端已经正常,而通过 Azure Functions 的启动或调试流程运行时仍使用其他 Python,再检查 .vscode/tasks.json、.vscode/launch.json 及相关启动配置,看是否显式指定了解释器或覆盖了环境变量。同时,在实际运行的 Python 进程中打印 sys.executable 进行对照。

备注:内容仅供参考。