python在哪里查找由ctypes.cdll打开的dll。在Windows上的?

我是无法在互联网上找不到一个简单的答案,所以也许将来有一个因为这个问题!

我正在使用pywiiuse,一个用于Windows上的C wiiuse库的python包装器。 通过在源代码目录中包含dll,header和library,我得到了几个简单的C示例。

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

dll = ctypes.cdll.wiiuse 

当我在与测试示例相同的目录中使用dll时,运行示例会产生模块未找到exception。

python在哪里寻找DLL?

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

ctypes/__init__.py的源代码:

 from _ctypes import LoadLibrary as _dlopen 

我无法在_ctypes.c找到LoadLibrary的定义,但可能它是Windows LoadLibraryEx函数的包装器,其行为类似于POSIX dlopen函数,因为它是如何使用的。

如果您可以修改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 – 它知道那个本地的位置。
  3. 从Kernel32.dll加载SetDllDirectory。 用你知道你的dll所在的路径来调用它。
  4. 现在LoadLibrary将在该文件夹中搜索Dll,因此您可以使用ctypes加载您的dll并调用您的函数。