我正在做一个项目,该项目需要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/