【发布时间】:2019-04-15 10:09:45
【问题描述】:
我已经编写了一个c代码并将其编译成一个dll,现在我正在尝试将其导入Python,然后我收到错误“OSError:[WinError 126]找不到指定的模块”。
我已经搜索过解决方案:在代码中我使用了其他一些 DLL:
python36.dll
ioterasdk.dll
KERNEL32.dll
所以我检查了它们是否都包含在内(除了我不知道如何检查的 KERNEL32.dll),我还将“python36.dll”的位置添加到系统环境变量中。
代码:
from ctypes import *
mydll = cdll.LoadLibrary("D:\\full\\path\\BlueTeraPy.dll")
我收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\admin\AppData\Local\Programs\Python\Python36-32\lib\ctypes\__init__.py", line 426, in LoadLibrary
return self._dlltype(name)
File "C:\Users\admin\AppData\Local\Programs\Python\Python36-32\lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found
我是 Stack Overflow 和一般 DLL 的新手,所以如果您需要更多信息,请告知。 谢谢
【问题讨论】:
-
根据我的经验,通常当您的 dll 尝试加载某些内容但失败时,您的 dll 是否有依赖关系?它们可以访问(在您的 PATH 上)吗?
-
我不确定“依赖项”的定义是什么。对于 python36.dll:我将其路径添加到系统环境变量中,对于 ioterasdk.dll:我将其头文件、dll 和 lib 文件复制到 BlueTeraPy.dll 的同一文件夹中。
-
您可以使用procmon 监控您的dll 正在尝试执行的操作,如果出现错误,您还可以使用dependency walker 静态分析dll 并查看它要加载的内容。我使用这两个工具来解决这个确切的问题
-
您的回溯表明您正在运行 32 位 Python。您确定要加载的 DLL 的位数正确吗? 32 位进程无法加载 64 位 DLL(反之亦然),如果位数不匹配,您经常会收到消息 找不到指定模块,即使您可以看到它在文件夹中。
-
我确实怀疑它与架构有关。我的电脑是64位的,建议我下载64位的python吗?