Python ctypes异常行为:加载不存在的库却调用math库函数
为什么这段代码能正常运行?
这背后是ctypes在Unix-like系统上的特殊行为,结合ctypes.util.find_library的返回逻辑共同导致的,拆解一下细节:
1. find_library("bob_is_your_uncle") 返回了 None
因为你的系统里确实不存在名为bob_is_your_uncle的库,ctypes.util.find_library找不到对应库文件,所以返回None。
2. ctypes.cdll.LoadLibrary(None) 会加载当前进程的符号表
在Linux、macOS这类Unix-like系统中,当你给LoadLibrary传入None时,它不会抛出错误,反而会创建一个能访问当前进程已加载的所有共享库符号的CDLL对象。你的Python进程本身已经默认链接了标准数学库(比如Linux的libm.so、macOS的libSystem.dylib),这些库中的函数(比如cos)早就存在于进程的全局符号表里。
3. boblib.cos 直接复用了进程中已有的cos函数
当你访问boblib.cos时,ctypes会在刚才加载的进程符号表里查找名为cos的函数,恰好标准数学库已经把这个函数加载进了进程,所以能成功找到并调用。你设置的argtypes和restype又让ctypes正确处理了参数和返回值的类型,最终自然能正常输出1.0。
至于print(boblib)输出<C...>的内容,那只是ctypes的CDLL对象的默认字符串表示——哪怕它关联的是当前进程的符号表,也会生成这样的实例对象。
内容的提问来源于stack exchange,提问作者AstrOne
相关产品推荐
相关产品推荐

