Anaconda环境中用ctypes加载.so文件的Python版本兼容问题
问题:Python 3.10.6虚拟环境无法加载共享对象myFile.so
问题详情
- 在Anaconda基础环境(Python 3.8.5)及Python 3.9.15版本的虚拟环境中,可通过以下代码正常加载并调用共享对象
myFile.so:
import ctypes clibrary = ctypes.CDLL(r"C:\Users\FirstName LastName\Documents\Project\myFile.so") clibrary.doThings(ctypes.c_int(10), ctypes.c_float(0.6))
- 切换至Python 3.10.6版本的虚拟环境
testEnvironment后,运行相同代码抛出错误:
FileNotFoundError: Could not find module 'C:\Users\FirstName LastName\Documents\Project\myFile.so' (or one of its dependencies). Try using the full path with constructor syntax.
- 已尝试的无效操作:
- 复制基础环境的
os.environ["PATH"]到虚拟环境 - 直接在
myFile.so所在目录运行代码
- 复制基础环境的
分析与解决方向
重新编译共享对象适配Python 3.10
Python 3.10对C API进行了部分变更(如废弃接口移除、ABI细节调整),myFile.so可能是基于Python 3.8/3.9的C API编译的,导致3.10.6无法兼容加载。需重新编译myFile.so,编译时指定链接Python 3.10的头文件和库文件。检查依赖库兼容性
使用Windows工具dumpbin /dependents myFile.so查看myFile.so依赖的系统库或Python相关库,确认这些库在3.10.6虚拟环境中是否存在、版本是否匹配。Python 3.10依赖的MSVC运行时版本可能与3.8/3.9不同,需确保对应版本的运行时已安装。调整ctypes加载方式
尝试显式添加依赖路径或更换加载函数:import os import ctypes # 添加共享对象所在目录到DLL搜索路径 os.add_dll_directory(r"C:\Users\FirstName LastName\Documents\Project") clibrary = ctypes.CDLL("myFile.so") clibrary.doThings(ctypes.c_int(10), ctypes.c_float(0.6))也可尝试用
ctypes.WinDLL替代ctypes.CDLL(Windows下部分共享库需用WinDLL加载)。临时降级虚拟环境版本
如果暂时无法重新编译共享对象,可继续使用Python 3.9.15版本的虚拟环境,该版本已验证可正常加载myFile.so。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

