如何在子进程中运行poetry install且不关联当前虚拟环境?
为什么设置cwd后poetry仍用当前虚拟环境?
- 子进程默认会完全继承父进程的环境变量,其中
VIRTUAL_ENV是poetry识别当前激活环境的核心标记。哪怕你指定了cwd,只要这个变量存在,poetry就会优先使用它指向的环境,不会为目标目录创建新环境。 - 另外,你当前运行脚本的环境是poetry虚拟环境,
PATH变量会优先包含该虚拟环境的bin目录——哪怕你尝试调用系统级poetry,实际执行的可能还是虚拟环境里的版本,它依然会读取VIRTUAL_ENV变量。
实现目标目录创建独立虚拟环境的方案
你需要在子进程中清除VIRTUAL_ENV环境变量,同时确保调用的是系统级poetry(或明确指定其绝对路径)。修改后的代码如下:
import subprocess import os other_directory = "/some/path" # 复制父进程环境变量,移除VIRTUAL_ENV标记 env = os.environ.copy() env.pop("VIRTUAL_ENV", None) # 执行安装(若系统poetry路径不在默认PATH,可写绝对路径如["/usr/local/bin/poetry", "install"]) subprocess.run( ["poetry", "install"], cwd=other_directory, env=env, check=True ) # 验证目标目录的虚拟环境信息 subprocess.run( ["poetry", "env", "info"], cwd=other_directory, env=env, check=True )
额外说明:
- 分开执行命令比用
&&拼接更清晰,也方便排查单步问题。 - 手动操作时无此问题,是因为你进入目标目录时,当前shell没有激活原虚拟环境(
VIRTUAL_ENV变量不存在),poetry会自动为当前目录创建独立环境。
内容的提问来源于stack exchange,提问作者RunOrVeith
相关产品推荐
相关产品推荐

