【问题标题】:Error while trying to load .dll into Python "The specified module could not be found"尝试将 .dll 加载到 Python 时出错“找不到指定的模块”
【发布时间】: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吗?

标签: python c dll


【解决方案1】:

不能自己加载库,必须在dll中找到库。

import ctypes import *
from ctypes.util import *
dll = find_library("D:\\full\\path\\BlueTeraPy.dll")
lib = cdll.LoadLibrary(dll)

【讨论】:

  • 感谢您的快速回复!我仍然得到同样的错误
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多