如何使用subprocess.check_call()在virtualenv中运行`pip`?

问题描述 投票:0回答:1

我正在尝试使用subprocess.check_call()在不同的Python virtualenvs中启动命令。

要激活virtualenv(以Python 2/3不可知的方式),我只需将我的virtualenv bin(或Windows下的Scripts)的路径附加到PATH,然后使用此修改后的环境调用subprocess.check_call()。像这样:

environment = os.environ.copy()
environment['PATH'] = os.pathsep.join([bin_path, environment['PATH']])

subprocess.check_call("pip install -r dev_requirements.txt", env=environment)

但是,我注意到pip会在系统Python站点包中安装所有内容。如果我更改check_call()

subprocess.check_call("pip install -r dev_requirements.txt", env=environment, shell=True)

然后突然pip如预期的那样在virtualenv中运作。

困扰我的是,在两种情况下,运行where pip首先让我通往virtualenv的pip

什么可以解释这种奇怪的行为?

python windows subprocess virtualenv
1个回答
2
投票

PATH并不是CreateProcess()在Windows上使用Popen()查找可执行文件的第一个地方。它可以使用与父pip.exe进程相同的目录中的python.exe。 shell(cmd.exe)使用不同的规则。见Popen with conflicting executable/path

避免依赖;使用pip的显式完整路径。在这种情况下,您无需更改环境:

import os
from subprocess import check_call

check_call([os.path.join(bin_path, 'pip.exe')] + 
           'install -r dev_requirements.txt'.split())
© www.soinside.com 2019 - 2024. All rights reserved.