首页 > 解决方案 > 在 Qt Creator 项目中嵌入 Python

问题描述

我正在开发一个项目,该项目需要 C++ 调用用 Python 编写的依赖于 Python 专有模块的程序。

该项目使用 Qt Creator 处理,Python 3.7.5 及其包通过 Miniconda 安装。我已经使用 Pybind11 进行了基本的嵌入工作,其中基本接口工作,但是,大多数外部模块无法导入。

例如,通过 Pybind11 导入 Numpy 时,会抛出以下错误(为简洁起见减少了):

Importing the numpy c-extensions failed.

Original error was: /home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python3.7/site-packages/numpy/core/_multiarray_umath.cpython-37m-x86_64-linux-gnu.so: undefined symbol: PyMemoryView_FromObject

通过 Pybind11 导入 tensorflow 时出现类似错误:

ImportError: /home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python3.7/lib-dynload/_ctypes.cpython-37m-x86_64-linux-gnu.so: undefined symbol: PyUnicode_FromFormat

在读取 C 扩展共享库时发现 Python 的 C API 似乎是一个问题。但是,像 lxml 这样使用 C 源文件的模块可以很好地导入。此外,我可以将问题模块导入与我正在处理的项目分开的项目中,这意味着这是一个设置问题。请注意,这个测试项目设置实际上并没有使用任何 QT 功能,而主要的却使用了。

我的PYTHONHOME环境变量如下所示:

['/home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python3.7', '/home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python3.7/site-packages', '/home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python37.zip', '/home/brentnallt/miniconda3/envs/car_class_nogpu/lib/python3.7/lib-dynload', '.']

使用 Qt Creator 嵌入时有什么特别需要考虑的吗?或者这可能是与设置错误不同的问题?

标签: pythonqtnumpyqt-creatorpython-c-api

解决方案


也许您可以考虑使用 PythonQt 作为从 Qt 应用程序调用和导入 python 库的替代模块。

我在我的项目中使用了很多它,它从未失败过,但从未将它与任何类型的数据科学模块一起使用,也许你可以给它一个机会

https://mevislab.github.io/pythonqt/


推荐阅读