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需要几个步骤:
- 确认他们在哪里使用文件系统调用 – 类似于一堆行看起来像:
if path.exists(cwd() + "bin" + "mydll.dll"): return cwd() + "bin"
。 或者,如果你感到勇敢,只需设置路径即可。 - 使用ctypes加载Kernel32.dll – 它知道那个本地的位置。
- 从Kernel32.dll加载SetDllDirectory。 用你知道你的dll所在的路径来调用它。
- 现在LoadLibrary将在该文件夹中搜索Dll,因此您可以使用ctypes加载您的dll并调用您的函数。