eglInitialize调用失败报EGL_NOT_INITIALIZED错误,如何解决?
问题
运行基于EGL的3D人体模型生成器时,执行以下代码出现eglInitialize失败的错误:
import OpenGL.EGL as egl from ctypes import pointer egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) print(egl_display) major, minor = egl.EGLint(), egl.EGLint() print(major, minor) egl.eglInitialize(egl_display, pointer(major), pointer(minor))
输出信息如下:
#################### the first two print info #################### <OpenGL._opaque.EGLDisplay_pointer object at 0x7f480e971940> c_int(0) c_int(0) #################### error #################### Traceback (most recent call last): File "main.py", line 10, in <module> egl.eglInitialize(egl_display, pointer(major), pointer(minor)) File "/data_HDD/zhuxingyu/anaconda3/envs/icon/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 415, in __call__ return self( *args, **named ) File "src/errorchecker.pyx", line 58, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError OpenGL.raw.EGL._errors.EGLError: EGLError( err = EGL_NOT_INITIALIZED, baseOperation = eglInitialize, cArguments = ( <OpenGL._opaque.EGLDisplay_pointer object at 0x7f480e971940>, <OpenGL.raw.EGL._types.LP_c_int object at 0x7f480e971ac0>, <OpenGL.raw.EGL._types.LP_c_int object at 0x7f480e971b40>, ), result = 0 )
运行代码的机器B信息:
- 配备5块NVIDIA GeForce GPU,CUDA版本11.4,驱动版本470.82.00(来自nvidia-smi);
- 已安装libegl1,/usr/lib/x86_64-linux-gnu/下存在相关.so文件:
/usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0 /usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0.0.0 /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.0 /usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.82.00 /usr/lib/x86_64-linux-gnu/libEGL.so /usr/lib/x86_64-linux-gnu/libEGL.so.1 /usr/lib/x86_64-linux-gnu/libEGL.so.1.0.0
- 通过VSCode远程SSH在机器B上运行代码,本地操作机器为A。
需要进行哪些配置或操作才能让eglInitialize正常运行?
解决建议
指定NVIDIA EGL库加载:系统可能优先使用Mesa的EGL库,通过环境变量强制指定NVIDIA版本:
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.82.00或者在Python代码开头添加:
import os os.environ['LD_PRELOAD'] = '/usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.470.82.00'配置虚拟显示环境:远程SSH无物理显示器,需借助虚拟显示:
- 安装xvfb服务:
sudo apt install xvfb - 用xvfb包裹代码运行:
xvfb-run -a python main.py
或者使用
pyvirtualdisplay库在代码中初始化虚拟显示:pip install pyvirtualdisplay修改代码:
from pyvirtualdisplay import Display display = Display(visible=0, size=(1920, 1080)) display.start() # 原EGL代码段 display.stop()- 安装xvfb服务:
指定目标GPU设备:多GPU环境下,明确指定要使用的GPU:
export CUDA_VISIBLE_DEVICES=0或在代码中设置:
import os os.environ['CUDA_VISIBLE_DEVICES'] = '0'调整EGL显示获取方式:尝试使用平台设备扩展获取显示句柄,替代默认显示:
import OpenGL.EGL as egl from ctypes import pointer # 初始化平台设备扩展 egl.eglInitializePlatformDisplayEXT(egl.EGL_PLATFORM_DEVICE_EXT, None, None) egl_display = egl.eglGetDisplay(egl.EGL_PLATFORM_DEVICE_EXT) major, minor = egl.EGLint(), egl.EGLint() egl.eglInitialize(egl_display, pointer(major), pointer(minor))验证EGL库加载状态:检查当前Python进程加载的EGL库:
ldd $(which python) | grep EGL若输出为Mesa库,说明需要调整LD_PRELOAD或系统库优先级。
内容的提问来源于stack exchange,提问作者K. Zhu
相关产品推荐
相关产品推荐

