首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pybind11:"ImportError: DLL未找到“试图在*.pyd解释器中导入*.pyd

Pybind11:"ImportError: DLL未找到“试图在*.pyd解释器中导入*.pyd
EN

Stack Overflow用户
提问于 2020-01-22 13:06:00
回答 2查看 3.1K关注 0票数 6

我在VisualStudio2019(社区)中构建了一个.pyd,它为一些只存在于LibRaw中的功能提供了一个包装器。该解决方案成功编译,没有任何警告或错误。该项目使用LibRaw、OpenCV和pybind11以及Python.h和相应的.lib-file。

当我试图在Python解释器中导入.pyd时,我得到:

代码语言:javascript
复制
C:\Users\Tim.Hilt\source\repos\cr3_converter\Release>dir
 Datenträger in Laufwerk C: ist Acer
 Volumeseriennummer: EC36-E45E

 Verzeichnis von C:\Users\Tim.Hilt\source\repos\cr3_converter\Release

22.01.2020  11:28    <DIR>          .
22.01.2020  11:28    <DIR>          ..
22.01.2020  11:28               808 cr3_converter.exp
22.01.2020  11:28         3.068.361 cr3_converter.iobj
22.01.2020  11:28           785.552 cr3_converter.ipdb
22.01.2020  11:28             1.908 cr3_converter.lib
22.01.2020  11:28         4.190.208 cr3_converter.pdb
22.01.2020  11:28           953.856 cr3_converter.pyd
31.10.2019  16:22        26.408.085 IMG_0482_raw.CR3
               7 Datei(en),     35.408.778 Bytes
               2 Verzeichnis(se), 77.160.587.264 Bytes frei

C:\Users\Tim.Hilt\source\repos\cr3_converter\Release>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cr3_converter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing cr3_converter: The specified module was not found.
>>> import cr3_converter.pyd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing cr3_converter: The specified module was not found.
>>>

所需的.dlls的路径(在本例中是Python;LibRaw是完全静态链接的)是在系统路径中设置的。

我查了“依赖”-沃克,但没有发现可疑的东西。下面是对应的依赖沃克映像。我还尝试了另一个工具(Dependencies.exe,本质上是对Dependency的重写,但考虑到了API-MS-WIN-CORE-....dlls),得到了一个错误,如下所示:

当我悬停在丢失的.dll上时,我可以看到一个api-ms-win... module could not be found on disk。我搜索并找到了模块,并将其目录路径添加到系统路径中。现在该模块不再高亮显示为红色,但C:\WINDOWS\SysWOW64\WS2_32.dll (屏幕截图顶部的红色高亮显示)仍然显示缺少导入。这会是个问题吗?

我是如何制作.pyd

  • 创建空的Visual项目(Win32;Python也是32位安装)
  • 将项目设置更改为.dll-configuration和.pyd-fileextension
  • 添加了OpenCV、LibRaw和Pybind11头文件的路径
  • 为OpenCV、LibRaw和Python3.8添加链接器的路径和输入文件
  • 构建解决方案(没有错误,没有警告)
  • 尝试在python-解释器中导入结果.pyd

我见过这个问题,其中OP遇到了库加载不同的Python-.dlls的问题,但在我的例子中,Dependency引用的库与路径变量中的库相同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-23 07:53:59

我悄悄地认为,Windows在与系统(/users) PATH-variable中列出的目录相同的目录中搜索Windows。

然而,事实并非如此,正如ProcMon所揭示的那样。现在,我将丢失的.dll复制到包含.pyd的文件夹中,一切正常。

票数 5
EN

Stack Overflow用户

发布于 2022-07-29 11:41:06

我想提出一种更易于管理的办法来解决所讨论的问题。

简短的回答是:通过os.add_dll_directory(...)指定DLL的所有目录,然后再指定.pyd-module。

更多细节。 One可以通过windbg (使用 ed ntdll!LdrpDebugFlags 1命令)或gflags ( gflags -i <your-app.exe> +sls)检查DLL加载问题。下面是输出示例:

代码语言:javascript
复制
65d8:3868 @ 1347896937 - LdrLoadDll - ENTER: DLL name: D:\dev\MyLib\MyLib.cp310-win_amd64.pyd
65d8:3868 @ 1347896937 - LdrpLoadDllInternal - ENTER: DLL name: D:\dev\MyLib\MyLib.cp310-win_amd64.pyd
65d8:3868 @ 1347896937 - LdrpResolveDllName - ENTER: DLL name: D:\dev\MyLib\MyLib.cp310-win_amd64.pyd
65d8:3868 @ 1347896937 - LdrpResolveDllName - RETURN: Status: 0x00000000
65d8:3868 @ 1347896937 - LdrpMinimalMapModule - ENTER: DLL name: D:\dev\MyLib\MyLib.cp310-win_amd64.pyd
ModLoad: 00007ffe`47360000 00007ffe`473c5000   D:\dev\MyLib\MyLib.cp310-win_amd64.pyd
65d8:3868 @ 1347896937 - LdrpMinimalMapModule - RETURN: Status: 0x00000000
65d8:3868 @ 1347896953 - LdrpFindKnownDll - ENTER: DLL name: MyLib.dll
65d8:3868 @ 1347896953 - LdrpFindKnownDll - RETURN: Status: 0xc0000135
65d8:15e4 @ 1347896953 - LdrpSearchPath - ENTER: DLL name: MyLib.dll
65d8:15e4 @ 1347896953 - LdrpComputeLazyDllPath - INFO: DLL search path computed: D:\dev\MyLib;C:\Python310;C:\Windows\SYSTEM32
65d8:15e4 @ 1347896953 - LdrpResolveDllName - ENTER: DLL name: D:\dev\MyLib\MyLib.dll
65d8:6c30 @ 1347896953 - LdrpResolveDllName - RETURN: Status: 0xc0000135
65d8:15e4 @ 1347896953 - LdrpResolveDllName - ENTER: DLL name: C:\Python310\MyLib.dll
65d8:15e4 @ 1347896953 - LdrpResolveDllName - RETURN: Status: 0xc0000135
65d8:15e4 @ 1347896953 - LdrpResolveDllName - ENTER: DLL name: C:\Windows\SYSTEM32\MyLib.dll
65d8:15e4 @ 1347896953 - LdrpResolveDllName - RETURN: Status: 0xc0000135
65d8:15e4 @ 1347896953 - LdrpSearchPath - RETURN: Status: 0xc0000135
65d8:15e4 @ 1347896953 - LdrpProcessWork - ERROR: Unable to load DLL: "MyLib.dll", Parent Module: "D:\dev\MyLib\MyLib.cp310-win_amd64.pyd", Status: 0xc0000135

可以清楚地看到,DLL只在D:\dev\MyLib;C:\Python310;C:\Windows\SYSTEM32目录中查找。这意味着Python忽略%PATH%而不使用%PYTHONPATH。我敢假设与Modules/_ctypes/callproc.c有某种关系-- LoadLibraryExW在那里被称为带有一些特定的标志。

Windows的函数AddDllDirectory可以克服这种限制。人们可以将其称为扩展目录列表,以便查找库。

幸运的是,Python提供了os.add_dll_directory(...)方法来实现这一点。首先应该通过此方法指定所有DLL的目录路径。然后,.pyd-module将成功加载。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59860465

复制
相关文章

相似问题

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