Python中使用ctypes.CDLL加载共享库时遇OSError问题
解决Ubuntu 18.04下加载libMdsdcl.so时libreadline.so.6缺失的问题
问题重现
我有一个隶属于MDSplus的共享库文件libMdsdcl.so,单独存放后执行以下Python代码时触发错误:
In [1]: import ctypes as c In [2]: from ctypes.util import find_library In [3]: name = 'Mdsdcl' In [4]: libname = find_library(name) In [5]: c.CDLL(libname)
报错信息:
OSError Traceback (most recent call last) <ipython-input-6-7c40f200b197> in <module>() ----> 1 c.CDLL(libname) /usr/lib/python3.6/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error) 346 347 if handle is None: ---> 348 self._handle = _dlopen(self._name, mode) 349 else: 350 self._handle = handle OSError: libreadline.so.6: cannot open shared object file: No such file or directory
已确认Python与库均为64位,代码在其他环境可正常运行,刚升级至Ubuntu 18.04,怀疑问题与libreadline相关。
问题原因
Ubuntu 18.04默认预装的是libreadline.so.7,而libMdsdcl.so编译时依赖的是旧版本的libreadline.so.6,系统中缺少这个依赖库导致加载失败。
解决方案
1. 安装官方提供的libreadline6包
Ubuntu的软件仓库中仍保留了旧版本的libreadline6,直接通过apt安装即可:
sudo apt update sudo apt install libreadline6
这是最稳妥的方式,不会破坏系统中其他程序的依赖。
2. (可选)手动创建软链接(仅当安装包无效时使用)
如果安装包后仍无法加载,可尝试手动创建软链接将libreadline.so.6映射到系统默认的readline链接:
sudo ln -s /usr/lib/x86_64-linux-gnu/libreadline.so.6 /usr/lib/x86_64-linux-gnu/libreadline.so
⚠️ 注意:这种方式可能会影响依赖新版本readline的程序,仅在必要时使用。
3. 验证修复
安装完成后,重新运行你的Python代码,应该可以成功加载libMdsdcl.so了。
内容的提问来源于stack exchange,提问作者Shawn Zamperini
相关产品推荐
相关产品推荐

