当我在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
将发生以下情况:
t.bat
激活一个 venv 并呼叫t1.py
。t1.py
正确报告来自 venv 的sys.executable
- 然后
t1.py
打电话给subprocess.run(['python', 't2.py'])
- 然后
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