You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Python子进程环境变量时虚拟环境依赖导入失败

问题:指定virtualenv运行Python子进程时找不到依赖模块

尝试在默认虚拟环境以外的wx虚拟环境中运行Python子进程,编写了如下Python脚本:

import os
import subprocess
from pathlib import Path
from icecream import ic

VIRTUAL_ENV = str(Path(Path.home(), '.pyenv/versions/wx'))

script_path = 'scripts/foo'
script_env = os.environ.copy()
script_env["VIRTUAL_ENV"] = VIRTUAL_ENV
ic(os.environ['VIRTUAL_ENV'])
ic(script_env['VIRTUAL_ENV'])
subprocess.run([script_path], env=script_env)

其中scripts/foo是一个bash脚本,用于调用依赖wx虚拟环境的Python程序。确认script_env['VIRTUAL_ENV']的值正确,但运行时出现以下错误:

Traceback (most recent call last):
File "/home/jeff/projects/scripts/wx_python/wx_python_standard_ids.py", line 1, in
import wx
ModuleNotFoundError: No module named 'wx'

解决方案

只设置VIRTUAL_ENV环境变量不足以让子进程切换到目标虚拟环境,因为系统会优先使用PATH环境变量里的默认Python解释器。需要同时修改PATH,让虚拟环境的bin目录优先级最高:

修改脚本中的环境变量设置部分,添加PATH的更新:

script_env = os.environ.copy()
script_env["VIRTUAL_ENV"] = VIRTUAL_ENV
# 将虚拟环境的bin目录放到PATH最前面,确保优先使用该环境的Python
script_env["PATH"] = f"{VIRTUAL_ENV}/bin:{script_env['PATH']}"

或者,也可以直接调用虚拟环境内的Python解释器来运行目标程序,跳过bash脚本:

subprocess.run([f"{VIRTUAL_ENV}/bin/python", "scripts/wx_python/wx_python_standard_ids.py"], env=script_env)

如果要保留原bash脚本foo,也可以在foo内部先激活虚拟环境再执行Python程序:

#!/bin/bash
source ~/.pyenv/versions/wx/bin/activate
python /home/jeff/projects/scripts/wx_python/wx_python_standard_ids.py

内容的提问来源于stack exchange,提问作者Psionman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:03:26