将 Python 嵌入到 Qt Creator 项目中



我正在做一个项目,该项目需要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 导入张量流时也会出现类似的错误:

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嵌入时,我有什么特别的注意事项吗?或者这可能是与设置错误不同的问题?

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

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

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

最新更新