嵌入式Python代码调用plt.imread()遇matplotlib模块缺失错误求助
我在DATA函数的嵌入式Python代码中尝试使用plt.imread()读取图像,代码如下:
IMPORT PYTHON3 AS PYTHON; IMPORT Std; IMPORT Image; myRec := RECORD STRING id; DATA image; END; ds := DATASET('img.flat', myRec, THOR); dims := GetImageDimensions(ds[2].image); DATA ReadImage(DATA image, SET OF INTEGER dims) := EMBED(Python) import cv2 import numpy as np import matplotlib.pyplot as plt image_np = np.frombuffer(image, dtype='uint8') dims = tuple(dims) image = plt.imread(io.BytesIO(image_np)) print(type(image)) np_array = np.array(image) print(np_array.shape) print(np_array) return bytearray(image_np) ENDEMBED; OUTPUT(ReadImage(ds[2].image,dims));
运行时出现如下错误:
Error, eclagent, 0, System error: 0: Graph graph1[1], remoteresult[4]: pyembed: No module named 'matplotlib', Master exception - caused by (0, pyembed: No module named 'matplotlib')
我已通过pip install matplotlib==3.7.1安装该模块,请问如何解决此错误并成功使用plt.imread()?
确认Python环境一致性:本地用
pip安装的matplotlib可能和ECL嵌入式调用的Python环境不匹配。ECL的PYTHON3接口默认调用系统指定的Python解释器,需确保该解释器对应的pip已安装matplotlib。可以在嵌入式代码中添加import sys; print(sys.executable)查看当前Python路径,再用该路径下的pip重新安装:/path/to/your/python/interpreter -m pip install matplotlib==3.7.1检查集群节点的环境配置:如果是在THOR集群等分布式环境运行,ECL Agent会在远程节点执行Python代码,需要在所有节点的对应Python环境中安装matplotlib。若使用虚拟环境,需确保ECL Agent加载了该虚拟环境的配置。
改用轻量图像读取方式:若仅需读取图像,可替换
plt.imread为cv2.imdecode或PIL.Image,避免依赖matplotlib。例如用OpenCV实现:import cv2 import numpy as np import io image_np = np.frombuffer(image, dtype='uint8') # 解码图像,默认BGR格式 image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) # 如需转为RGB格式 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)显式指定Python环境路径:在ECL代码中导入PYTHON3时,通过参数指定已安装matplotlib的Python解释器路径:
IMPORT PYTHON3 AS PYTHON('python_path'='/path/to/python/with/matplotlib');
内容的提问来源于stack exchange,提问作者Dumbledore

