首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在windows上,python在哪里寻找由ctypes.cdll.<name>打开的dll?

在windows上,python在哪里寻找由ctypes.cdll.<name>打开的dll?
EN

Stack Overflow用户
提问于 2011-06-25 09:14:07
回答 2查看 10.4K关注 0票数 9

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

我使用的是pywiiuse,这是windows上C wiiuse库的python包装器。通过在源代码的目录中包含dll、头文件和库,我已经获得了几个简单的C示例。

然而,我想知道把dll放在哪里,这样pywiiuse就能找到它。看一下源代码,可以看到它是按如下方式加载的:

代码语言:javascript
复制
dll = ctypes.cdll.wiiuse

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

python在哪里寻找dll?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-25 12:52:10

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

ctypes/__init__.py的源代码执行以下操作:

代码语言:javascript
复制
from _ctypes import LoadLibrary as _dlopen

我在_ctypes.c中找不到LoadLibrary的定义,但它大概是Windows LoadLibraryEx函数的包装器,其行为类似于POSIX dlopen函数,因为它就是这样使用的。

如果您可以修改Python源代码以使用ctypes.CDLL构造函数,那么它应该可以工作:

代码语言:javascript
复制
folder = os.path.dirname(os.path.abspath(__file__))
dll_path = os.path.join(folder, "wiiuse.dll")    
dll = ctypes.CDLL(dll_path)

如果这是不可行的,你也许能够用猴子补丁ctype来处理这个特定的情况,但这看起来有点危险。也许只需将DLL复制到与Python DLL相同的文件夹中将是最简单的替代方案。

票数 6
EN

Stack Overflow用户

发布于 2015-07-20 16:44:23

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

  1. 确认他们在哪里使用文件系统调用-类似于一整堆代码行,看起来类似于:if path.exists(cwd() + "bin" + "mydll.dll"): return cwd() + "bin"
  2. 使用ctype来加载Kernel32.dll -它本身就知道那个文件在哪里。
  3. 从Kernel32.dll加载SetDllDirectory。使用您知道dll所在位置的路径调用它。
  4. Now LoadLibrary将在该文件夹中搜索dll,因此您可以使用ctype加载dll并调用函数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6475150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档