ctypes.cdll.LoadLibrary(无)如何工作?

deb*_*ish 6 python ctypes python-3.x

ctypes.cdll.LoadLibrary()call 如何None作为参数传入?当我尝试下面的代码时,似乎math库自动加载:

>>> import ctypes
>>> lib = ctypes.cdll.LoadLibrary(None)
>>> lib.sin
<_FuncPtr object at 0x7f36dd65f430>
>>> lib.exp
<_FuncPtr object at 0x7f36dd65f4f8>
>>> 
Run Code Online (Sandbox Code Playgroud)

如何在math未明确指定的情况下加载库?是否加载了标准库中的所有共享库?幕后发生的事情我不明白.

Cri*_*ati 5

注意:您在Nix上遇到了这个问题(在Win上它是不可重现的)。

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

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

根据[Python.Docs]:ctypes - 加载共享库,在加载库时使用它:

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