Python3.6环境下PyInstaller打包OpenCV程序在RHEL7.1运行报错求助
报错信息:
File "cv2/init.py" line 5, in
ImportError: libX11.so.6: undefined symbol: xcb_poll_for_reply64
报错原因
该问题核心是底层系统库版本不兼容:
- RHEL7.1自带的libxcb版本为1.11,不存在
xcb_poll_for_reply64符号,该符号是libxcb 1.12及以上版本新增的 - 你在RHEL7.7上打包时使用的libX11.so.6是适配高版本libxcb编译的,PyInstaller默认不会自动打包libxcb这类底层系统库,可执行文件在RHEL7.1运行时会优先调用系统自带的低版本libxcb,符号匹配失败就会抛出报错
- 你安装的opencv-python包也是在高版本系统下编译的,依赖的底层图形库版本和RHEL7.1不匹配
解决方案
方案1:打包时强制包含高版本依赖库
适合不能切换打包环境的场景:
- 先在RHEL7.7打包环境中找到对应的高版本libxcb文件,执行命令:
ldd /usr/lib64/libX11.so.6 | grep libxcb
获取libxcb.so.1的实际路径,通常为/usr/lib64/libxcb.so.1 - PyInstaller打包时添加参数绑定该库:
pyinstaller --onefile --add-binary "/usr/lib64/libxcb.so.1:." your_script.py - 运行可执行文件前,设置LD_LIBRARY_PATH优先加载打包的库:
LD_LIBRARY_PATH=./ ./your_executable
也可以在Python脚本最开头加入以下代码,自动设置运行时库路径:
import os import sys # 适配PyInstaller运行临时目录 if hasattr(sys, '_MEIPASS'): os.environ['LD_LIBRARY_PATH'] = sys._MEIPASS + os.pathsep + os.environ.get('LD_LIBRARY_PATH', '')
方案2:在低版本系统上打包
兼容性最好的方案:
在RHEL7.1系统上搭建完全一致的Python3.6环境,安装对应版本的OpenCV、PyInstaller依赖,直接在该环境下打包。低版本系统编译打包的二进制文件,兼容所有RHEL7.x更高版本系统,不会出现库兼容问题。
方案3:使用无GUI版本的OpenCV
如果你没有用到OpenCV的imshow、图形窗口等GUI功能,直接替换为无头版本的OpenCV即可:pip uninstall opencv-pythonpip install opencv-python-headless==<你当前使用的OpenCV版本号>
这个版本不依赖X11、libxcb等图形相关系统库,打包后不会触发该报错。
内容的提问来源于stack exchange,提问作者vpa
相关产品推荐
相关产品推荐

