python在哪里寻找ctypes.cdll打开的dll。 在窗户上?


问题内容

我很无法在互联网上找到一个简单的答案,所以将来可能会因为这个问题而有一个答案!

我正在使用pywiiuse,这是Windows上C wiiuse库的python包装器。通过将dll,标头和库包含在源目录中,我已经获得了几个简单的C示例。

但是,我想知道将dll放在哪里,以便pywiiuse可以找到它。查看源代码可以看到它的加载方式如下:

dll = ctypes.cdll.wiiuse

当我将dll与测试示例放在同一目录中时,运行示例将产生模块未找到异常。

python在哪里寻找dll?


问题答案:

Windows动态链接库搜索顺序被记录在MSDN上。它不是特定于Python的,并且无法通过命令行选项更改搜索顺序。(但请参阅链接的文章,以了解其他影响搜索顺序的方法。)

来源ctypes/__init__.py

from _ctypes import LoadLibrary as _dlopen

我找不到LoadLibraryin的定义_ctypes.c,但大概是WindowsLoadLibraryEx函数的包装,其行为类似于POSIXdlopen函数,因为这是使用它的方式。

如果可以修改Python源以改为使用ctypes.CDLL构造函数,则它应该可以工作:

folder = os.path.dirname(os.path.abspath(__file__))
dll_path = os.path.join(folder, "wiiuse.dll")    
dll = ctypes.CDLL(dll_path)

如果那不可行,您可能可以使用猴子补丁ctypes来处理这种特定情况,但这似乎有些危险。也许仅将DLL复制到与Python
DLL相同的文件夹中将是最简单的选择。