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

问题描述 投票:6回答:2

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

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

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

dll = ctypes.cdll.wiiuse

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

python在哪里寻找DLL?

python c dll ctypes
2个回答
4
投票

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

ctypes/__init__.py的来源确实:

from _ctypes import LoadLibrary as _dlopen

我无法在LoadLibrary中找到_ctypes.c的定义,但可能它是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在同一文件夹中将是最简单的选择。


1
投票

使用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并调用您的函数。
© www.soinside.com 2019 - 2024. All rights reserved.