为什么在虚拟环境中使用 subprocess.run() 执行时 'python -m pip' 会运行错误的 pip?
Why does 'python -m pip' runs the wrong pip when executed using subprocess.run() from a virtual environment?
我正在追踪我们测试脚本中的一个错误,由于某种原因执行了错误的 pip。
我制作了一个最小的脚本来重现它,以确保它不是测试脚本的罪魁祸首。
所以我的最小脚本是:
import os
import subprocess
import sys
print(sys.executable)
print('system pip:')
os.system('pip -V')
print()
print('system python pip:')
os.system('python -m pip -V')
print()
print('system where python:')
os.system('where python')
print()
print('system VIRTUAL_ENV:')
os.system('cmd /c echo %VIRTUAL_ENV%')
print()
print('system PYTHONPATH:')
os.system('cmd /c echo %PYTHONPATH%')
print()
print('subprocess pip:')
subprocess.run(['pip', '-V'])
print()
print('subprocess python pip:')
subprocess.run(['python', '-m', 'pip', '-V'])
print()
print('subprocess where python:')
subprocess.run(['cmd', '/c', 'where', 'python'])
print()
print('subprocess sys.executable pip:')
subprocess.run([sys.executable, '-m', 'pip', '-V'])
print()
print('subprocess VIRTUAL_ENV:')
subprocess.run(['cmd', '/c', 'echo', '%VIRTUAL_ENV%'])
print()
print('subprocess PYTHONPATH:')
subprocess.run(['cmd', '/c', 'echo', '%PYTHONPATH%'])
print()
当我 运行 它与我的 venv 活动时,它打印:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
system pip:
pip 20.0.2 from c:\users\calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
system python pip:
pip 20.0.2 from C:\Users\Calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
system where python:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
C:\Program Files\Python37\python.exe
C:\Users\Calmarius\AppData\Local\Microsoft\WindowsApps\python.exe
system VIRTUAL_ENV:
C:\Users\Calmarius\pythonvenv\myvenv
system PYTHONPATH:
%PYTHONPATH%
subprocess pip:
pip 20.0.2 from c:\users\calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
subprocess python pip:
pip 20.0.2 from C:\Program Files\Python37\lib\site-packages\pip (python 3.7)
subprocess where python:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
C:\Program Files\Python37\python.exe
C:\Users\Calmarius\AppData\Local\Microsoft\WindowsApps\python.exe
subprocess sys.executable pip:
pip 20.0.2 from C:\Users\Calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
subprocess VIRTUAL_ENV:
C:\Users\Calmarius\pythonvenv\myvenv
subprocess PYTHONPATH:
%PYTHONPATH%
基本上它按预期工作,除了使用子进程执行 python -m pip
的唯一情况,由于某种原因它执行系统的 pip 而不是 venv one。正是测试脚本所做的组合。
我的同事也没有问题 运行 宁它。所以发生了一些特定于我的机器的事情,但我不知道从哪里开始。
有人知道是什么原因造成的吗?
看来这是3.7.3中引入的bug
可能的解决方法是在调用另一个 python 进程时使用 sys.executable
,而不是依赖 OS 来找到正确的路径。
我正在追踪我们测试脚本中的一个错误,由于某种原因执行了错误的 pip。 我制作了一个最小的脚本来重现它,以确保它不是测试脚本的罪魁祸首。 所以我的最小脚本是:
import os
import subprocess
import sys
print(sys.executable)
print('system pip:')
os.system('pip -V')
print()
print('system python pip:')
os.system('python -m pip -V')
print()
print('system where python:')
os.system('where python')
print()
print('system VIRTUAL_ENV:')
os.system('cmd /c echo %VIRTUAL_ENV%')
print()
print('system PYTHONPATH:')
os.system('cmd /c echo %PYTHONPATH%')
print()
print('subprocess pip:')
subprocess.run(['pip', '-V'])
print()
print('subprocess python pip:')
subprocess.run(['python', '-m', 'pip', '-V'])
print()
print('subprocess where python:')
subprocess.run(['cmd', '/c', 'where', 'python'])
print()
print('subprocess sys.executable pip:')
subprocess.run([sys.executable, '-m', 'pip', '-V'])
print()
print('subprocess VIRTUAL_ENV:')
subprocess.run(['cmd', '/c', 'echo', '%VIRTUAL_ENV%'])
print()
print('subprocess PYTHONPATH:')
subprocess.run(['cmd', '/c', 'echo', '%PYTHONPATH%'])
print()
当我 运行 它与我的 venv 活动时,它打印:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
system pip:
pip 20.0.2 from c:\users\calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
system python pip:
pip 20.0.2 from C:\Users\Calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
system where python:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
C:\Program Files\Python37\python.exe
C:\Users\Calmarius\AppData\Local\Microsoft\WindowsApps\python.exe
system VIRTUAL_ENV:
C:\Users\Calmarius\pythonvenv\myvenv
system PYTHONPATH:
%PYTHONPATH%
subprocess pip:
pip 20.0.2 from c:\users\calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
subprocess python pip:
pip 20.0.2 from C:\Program Files\Python37\lib\site-packages\pip (python 3.7)
subprocess where python:
C:\Users\Calmarius\pythonvenv\myvenv\Scripts\python.exe
C:\Program Files\Python37\python.exe
C:\Users\Calmarius\AppData\Local\Microsoft\WindowsApps\python.exe
subprocess sys.executable pip:
pip 20.0.2 from C:\Users\Calmarius\pythonvenv\myvenv\lib\site-packages\pip (python 3.7)
subprocess VIRTUAL_ENV:
C:\Users\Calmarius\pythonvenv\myvenv
subprocess PYTHONPATH:
%PYTHONPATH%
基本上它按预期工作,除了使用子进程执行 python -m pip
的唯一情况,由于某种原因它执行系统的 pip 而不是 venv one。正是测试脚本所做的组合。
我的同事也没有问题 运行 宁它。所以发生了一些特定于我的机器的事情,但我不知道从哪里开始。
有人知道是什么原因造成的吗?
看来这是3.7.3中引入的bug
可能的解决方法是在调用另一个 python 进程时使用 sys.executable
,而不是依赖 OS 来找到正确的路径。