venv not sticking across subprocess.run on python/windows?



当我在Windows上制作python venv时:

C:> mkdir C:tvenv
C:> cd C:tvenv
C:> python -m venv v

然后创建以下三个文件:

t.bat

call "C:tvenvvScriptsactivate.bat"
python t1.py

t1.py

import subprocess
import sys
print('T1', sys.executable)
subprocess.run(['python', 't2.py'])

t2.py

import sys
print('T2', sys.executable)

然后我运行t.bat

C:> t.bat

观察到的输出

T1 C:tvenvvScriptspython.exe
T2 C:Program FilesPython38python.exe

将发生以下情况:

  1. t.bat激活一个 venv 并呼叫t1.py
  2. t1.py正确报告来自 venv 的sys.executable
  3. 然后t1.py打电话给subprocess.run(['python', 't2.py'])
  4. 然后t2.py报告系统范围的sys.executable,而不是来自venv

即我本来希望输出是:

预期输出

T1 C:tvenvvScriptspython.exe
T2 C:tvenvvScriptspython.exe

activate.bat集:

set PATH=%VIRTUAL_ENV%Scripts;%PATH%

它将 venv 脚本目录放在 PATH 的前面。

那么为什么subprocess.run(['python'])找不到Venv Python而不是系统范围的Python呢?

更新

我使用的是最新的 Windows 10 x64。我刚刚从标准的 python.org Windows 安装程序完全重新安装了 Python 3.9.1,甚至没有把它放在我的PATH中。 问题仍然存在。

这个问题确实与 Windows 行为有关,实际上主要的解决方案是使用sys.exectuable而不是python来实际启动预期的 python 二进制文件,而不是让操作系统自己解决这个问题.
关于这个问题的更多解释以及操作系统如何影响subprocess.run命令的行为: https://github.com/python/cpython/issues/86207

最新更新