在Windows上,Python在哪里搜索被ctypes.cdll.<name>打开的dll?

2024-04-20 01:00:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是非洲裔,我在网上找不到一个简单的答案,所以也许将来会有一个因为这个问题!

我用的是pywiiuse,一个windows上C wiiuse库的python包装器。我已经得到了几个简单的C示例,只需在源目录中包含dll、头和库。

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

dll = ctypes.cdll.wiiuse

当dll与测试示例位于同一目录中时,运行示例会产生模块未找到异常。

python在哪里查找dll?


Tags: 模块答案目录示例源代码windows方式ctypes
2条回答

Windows DLL search order记录在MSDN上。它不是特定于Python的,并且无法从命令行选项更改搜索顺序。(有关影响搜索顺序的其他方法,请参阅链接的文章。)

^{}的源执行以下操作:

from _ctypes import LoadLibrary as _dlopen

我在^{}中找不到LoadLibrary的定义,但可能它是Windows ^{}函数的包装器,其行为类似于POSIX ^{}函数,因为它就是这样使用的。

如果您可以修改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位于同一文件夹中是最简单的选择。

使用Windows API在自定义文件夹中加载自定义DLL需要几个步骤:

  1. 确认它们使用文件系统调用的位置-类似于一堆类似于:if path.exists(cwd() + "bin" + "mydll.dll"): return cwd() + "bin"的行。或者如果你觉得自己很勇敢,那就走吧。
  2. 使用ctypes加载Kernel32.dll—它知道Kernel32.dll本机在哪里。
  3. 从Kernel32.dll加载SetDllDirectory。用你知道你的dll在哪里的路径来调用它。
  4. 现在LoadLibrary将在该文件夹中搜索dll,因此您可以使用ctypes加载dll并调用函数。

相关问题 更多 >