繁体   English   中英

Python/C++ 包装器使用外部 dll 和 Pybind11

[英]Python/C++ wrapper Using external dll with Pybind11

Python 版本: 3.8.1 Spyder 版本: 3.3.6 Qt 版本: 5.12.9包装器:使用 PyBind11 开发

我在 C++ 中包装了dll开发,它使用Qt dlls与 ZA7F5F35413B5274117363 一起使用。 我使用编译器 MSVC 使用 Visual Studio 2019 编写了包装器(因为我的 dll 是使用 MSVC 编译的)。 在 VS2019 中生成解决方案后,我获得了一个.pyd文件,该文件可以使用 python 导入。

当我使用 python 在线命令时效果很好:

  1. 启动cmd.exe
  2. $python
  3. import MyLibName我可以使用函数/类...

但是如果我尝试使用 Spyder,我会收到以下错误:

ImportError: DLL load failed while importing PyStack: The specified module could not be found..

所以这是我的问题:

有没有办法获取有关ImportError的更多信息,例如缺少的dll的名称或其他信息?

我不明白为什么这个问题只发生在 spyder 上。 我尝试使用IPython Qt控制台,它可以工作。 spyder 是否使用嵌入式 python 版本之类的?

我不完全理解 dll 应该如何管理,我的意思是我应该提供 dll 之类的libGLESV2.dll.pyd吗?

先感谢您。

我猜

我想我发现 Qt/python 的哪个部分产生了这个问题,但我仍然不知道如何解决它。

我的 dll 使用需要执行事件循环的信号/插槽。 如果事件循环已经在运行 dll 将尝试使用它,如果循环版本(例如:PyQt5==5.14.1)与我的(例如 Qt==5.15.1)不同,则无法导入。

请注意,反之亦然,如果我运行 dll 然后尝试使用 %gui qt 启动循环,该命令将引发错误。

如何重现该问题:

  1. 编译一个 Qt 项目在这里可用。
  2. 将 output dll 复制到 VS 项目的 PyMyStack/dependencies 文件夹中(可在此处获得)
  3. 编译VS项目。
  4. 打开 IPython 控制台(不使用 qt 有事件循环)
  5. 导入用 VS 创建的模块(导入 PyMyStack)
  6. 运行魔术命令 %gui qt

最后一条命令应打印: ERROR:root:DLL load failed while importing QtSvg: The specified procedure could not be found.

如何隐藏/解决问题:

免责声明:这里提供的解决方案肯定不是最好的,如果您知道更好的解决方案,请分享☺

如果你只想在 Spyder 中导入你的库,你可以使用另一个事件循环。 以下是更改此设置的步骤:

  1. 在 Spyder 菜单 go 到工具→首选项
  2. Select “IPython 控制台”
  3. Go 到“图形”选项卡并将后端组合框更改为除 Qt 或自动之外的任何其他值

如果你想使用 Qt 事件循环,你必须更新它。 您可以使用 pip 命令执行此操作,但请记住 Spyder 与某些版本不兼容。 这是 pip 命令:

Pip install PyQt5==X.Y.Z

其中 X 和 Y 是用于编译 Qt 项目的相同版本。 最后一位数字版本似乎并不重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM