修改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
相关产品推荐
相关产品推荐

