ctypes.cdll.LoadLibrary(None)是如何工作的?

8
当使用None作为参数调用ctypes.cdll.LoadLibrary()方法时,它是如何工作的?当我尝试下面的代码时,似乎math库会自动加载:
>>> import ctypes
>>> lib = ctypes.cdll.LoadLibrary(None)
>>> lib.sin
<_FuncPtr object at 0x7f36dd65f430>
>>> lib.exp
<_FuncPtr object at 0x7f36dd65f4f8>
>>> 

math库是如何在不明确指定的情况下被加载的?标准库中的所有共享库都会被加载吗?有一些幕后发生的事情我不理解。

1个回答

5

注意:你在Nix(在Win上不可复现)遇到了这个问题。

看一下[SO]: 如何在没有异常的情况下检查文件是否存在?(@CristiFati的回答)。在那里,我在项目 #4. 的最后部分(即笔记部分)中解释了这个确切的场景,引用了[Man7]: DLOPEN(3)中的以下段落:

如果 filename 是 NULL,则返回的句柄是主程序的句柄。当传递给 dlsym() 时,此句柄导致搜索主程序中的符号,然后搜索所有在程序启动时加载的共享对象,然后搜索由使用标志 RTLD_GLOBALdlopen() 加载的所有共享对象。

根据[Python.Docs]: ctypes - Loading shared libraries的说法,在加载库时使用它:

所有这些类都可以通过至少一个参数——共享库的路径名来调用。如果您已经有一个对已加载的共享库的现有句柄,它可以作为handle命名参数传递,否则将使用基础平台的dlopenLoadLibrary函数将库加载到进程中,并获取句柄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接