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

时间:2018-04-17 13:02:25

标签: python python-3.x ctypes

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

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

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

1 个答案:

答案 0 :(得分:4)

注意:您在 Nix上遇到此问题(在 Win 上,它无法重现)。

查看[SO]: How to check whether a file exists without exceptions? (@CristiFati's answer)
#4 的最后一部分(注释部分) / strong>,我解释了这个确切的场景,引用了[man7]: DLOPEN(3)中的以下段落:

  

如果 filename 为NULL,则返回的句柄为main   程序。当赋予 dlsym ()时,此句柄会导致搜索a   主程序中的符号,后跟加载的所有共享对象   程序启动,然后由 dlopen ()加载的所有共享对象   标志 RTLD_GLOBAL

在加载库时使用,根据[Python 3]: Loading shared libraries

  

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