某公司人事管理网站开发,设计中国北京官网,红鹊豆网络网站站建设,怎么做app软件开发QT C中调用python脚本时#xff0c;import第三方库失败问题解决 文章目录 QT C中调用python脚本时#xff0c;import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言
项目需要#xff0c…QT C中调用python脚本时import第三方库失败问题解决 文章目录 QT C中调用python脚本时import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言
项目需要计划通过C的QT调用Python脚本实现更快的算法实现并集成在项目软件上。但是在按照网上教程配置好C调用Python脚本的环境后在调用import对应路径下的py文件时基本没有问题。但是一旦调用numpy、matplotlib时则PyImport_ImportModule函数即会返回失败 因此这里重点针对import第三方库却PyImport_ImportModule失败的问题进行解决。关于配置C调用Python脚本的环境参考上述链接即可并不复杂。 一、问题复现
首先对具体问题进行更加细致的复现。在C代码中具体代码如下。
// 1. 设置Python的运行环境目录Py_SetPythonHome(LD:/Software/anaconda3/envs/xxxx);// 2. 初始化python解释器Py_Initialize();// 2.1 检查初始化是否成功if (!Py_IsInitialized()) {qDebug() Python init fail;Py_Finalize();}// 3.1 执行Python脚本语句PyRun_SimpleString(print(I am Python!));// 3.2 初始化python系统文件路径保证可以访问到 .py文件PyRun_SimpleString(import sys);PyRun_SimpleString(sys.path.append(E:/Code/xxxx/));// 3.3 将文件作为模块import导入不需写后缀PyObject* pModule PyImport_ImportModule(MyTest);if (pModule NULL) {qDebug() module not found;return;}// 3.4 调用函数PyObject* pFunc PyObject_GetAttrString(pModule, test);if (!pFunc || !PyCallable_Check(pFunc)) {qDebug() not found function test;return;}在这里MyTest.py文件内代码如下。
import numpy as np
from matplotlib import pyplot as plt
import time
import mathdef test():print(hello!)此时若将MyTest.py中import的四个模块语句注释则程序没有任何问题正常运行。但是若不注释那四句则 PyObject* pModule PyImport_ImportModule(“MyTest”)会返回NULL。这时便会给我们产生错觉似乎该环境下调用通过pip install安装的第三方库便会失败即需要进一步配置这些第三方库的环境。
二、调试过程
首先便是按照上述思路进行百度谷歌寻找答案主要是配置python的库文件的环境变量等这里不赘述总之这并不能解决问题 后来突然发现在C代码中有这么一句
PyRun_SimpleString(import sys);调试发现该句代码是成功运行的所以便推倒前述结论该环境下调用通过pip install安装的第三方库便会失败。那么也就是说仅是上述的某些库import失败了而非所有第三方库于是分别对MyTest.py中的import部分代码轮流注释如下
import numpy as np
# from matplotlib import pyplot as plt
# import time
# import mathdef test():print(hello!)结果发现当单独import time与math时PyObject* pModule PyImport_ImportModule(“MyTest”)返回并不为空也就是说是导入成功的因此可以正确推出结论PyImport_ImportModule在执行Import numpy与matplotlib时会失败。 但是为什么会失败呢仅从上述代码中的返回结果仍然无法看出错误原因。于是修改C代码将下述两行代码加入到PyRun_SimpleString(“import sys”)之后。
PyRun_SimpleString(import numpy);
PyRun_SimpleString(import matplotlib);于是背后真正的错误便迎面儿来了。当import numpy时错误为
and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.Original error was: DLL load failed while importing _multiarray_umath: 找不到指定的模块。当import matplotlib时错误为
ImportError: cannot import name Image from PIL (unknown location)三、问题解决
其实当背后错误出现时再解决问题就很好办了对应去搜背后错误的解决方法即可。我相应参考numpy问题解决与matplotlib问题解决两个问题便都迎刃而解了。这里总结一下。
1 numpy问题解决
重新安装numpy即可
pip uninstall numpy
pip install numpy2 matplotlib问题解决
pip uninstall pillow
pip install pillow可以发现都是通过重新安装库或者关键依赖库后问题得以解决至于具体原因是什么还不是非常清楚也由于时间问题就不深入挖掘了希望后续有大佬搞清楚以后欢迎交流讨论
四、补充说明
本部分为后续补充内容。在完成本篇博客后后续项目推进上又碰到了很多类似问题例如同样在C调用Python拓展模块时报错
ImportError: DLL load failed while importing cv2: 找不到指定的模块。此时我按照本文提出方法卸载opencv后继续安装也进一步安装了opencv-contrib-python模块等均未解决问题。后来考虑是否为opencv版本太高呢于是将opencv降版本至4.5.1.48问题解决至此大概可以为为本文的问题形成一个结论当出现找不到指定模块、DLL加载失败等类似问题时可考虑一种很大可能性是该库的版本与环境不匹配可能版本太旧但同样也可能版本太新此时可调整几个版本测试很多类似问题可能也就此解决了 另外在本部分的研究内容中需要自行编译支持gstreamer编码器的opencv感觉这类opencv库应该需求量很大但是却没有人提供编译好的库故此在这里提供链接。
五、参考资料
最后感谢各位大佬提供的前人经验 [1] alxe_made: Qtcreator中C调用python方法 [2] HJ: 成功解决ImportError: cannot import name ‘image‘ from ‘PIL‘unknown location [3] 衷科知眠: 成功解决ImportError: cannot import name ‘image‘ from ‘PIL‘unknown location