QT C++中调用python脚本时,import第三方库失败问题解决

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(L"D:/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 numpy

2 matplotlib问题解决

pip uninstall pillow
pip install pillow

可以发现,都是通过重新安装库或者关键依赖库后,问题得以解决!至于具体原因是什么,还不是非常清楚,也由于时间问题,就不深入挖掘了,希望后续有大佬搞清楚以后,欢迎交流讨论!

四、参考资料

最后,感谢各位大佬提供的前人经验:
[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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL 在已有表中修改列名的方法

文章目录 1. MySQL2. SQL Server3. Oracle / PostgreSQL Question&#xff1a; 假设有一张表 StudentInfo&#xff0c;表中有一个列名是 Student_Name &#xff0c;想要把这个列名改成 StudentName 应该如何操作&#xff1f; 建表语句如下&#xff1a; --建表 if object_id(S…

【Nginx】反向代理和负载均衡

反向代理 nginx 反向代理&#xff0c;就是将前端发送的动态请求由 nginx 转发到后端服务器。 server {listen 80;server_name localhost;# 反向代理,处理管理端发送的请求location /api/ {proxy_pass http://localhost:8080/admin/;#proxy_pass http://webservers/…

2023我的编程之旅-地质人的山和水

引言 大家好&#xff0c;我是搞地质的。外行人有的说我们游山玩水&#xff0c;有的说我们灰头土脸&#xff0c;也有的说我们不是科学。 而我说&#xff0c;这是一门穷极一生青春&#xff0c;值得奉献的行业。这是一门贴近民生&#xff0c;又拥抱自然的学科。他的真理性在于探…

linux 热补丁机制基本概念

linux 热补丁技术叫 livepatch 机制&#xff0c;可以在不重启内核的情况下应用补丁到内核中&#xff0c;常用于服务器环境&#xff0c;比如服务器处于生产环境不能随意重启&#xff0c;而为了应对某些临时发现漏洞修补&#xff0c;则可以通过该机制进行动态修复。 依赖于 kpro…

【数据结构】一些数组面试题以及顺序表的思考

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 数组相关面试题2. 顺序表的问题及思考 1. 数组相关面试题 1.原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) {i…

网络安全—部署CA证书服务器

文章目录 网络拓扑安装步骤安装证书系统安装从属证书服务器 申请与颁发申请证书CA颁发证书 使用windows Server 2003环境 网络拓扑 两台服务器在同一网段即可&#xff0c;即能够互相ping通。 安装步骤 安装证书系统 首先我们对计算机名进行确认&#xff0c;安装了证书系统后我…

59.网游逆向分析与插件开发-游戏增加自动化助手接口-文字资源读取类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏菜单文字资源读取的逆向分析-CSDN博客 之前的内容&#xff1a;接管游戏的自动药水设定功能-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fing…

Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿&#xff08;某个热点key缓存失效&#xff09; 概念 缓存中没有但数据库中有的数据&#xff0c;假如是热点数据&#xff0c;那key在缓存过期的一刻&#xff0c;同时有大量的请求&#xff0c;这些请求都会击穿到DB&#xff0c;造成瞬时DB请求量大、压力增大和缓存雪崩的…

定性数据的介绍与讨论

关于数据的分类 数据可以根据不同的属性和特征进行分类。以下是数据常见的分类方式&#xff1a; 1. 数值型数据&#xff1a;表示为具体的数值&#xff0c;可以进行数学运算和统计分析。例如年龄、身高、体重等。 2. 分类型数据&#xff1a;表示为不同的类别或标签&#xff0…

c++语言基础18-开房门

题目描述 假设你手里有一串钥匙&#xff0c;这串钥匙上每把钥匙都有一个编号&#xff0c;对应着一个房门的编号。现给你一个房门编号&#xff0c;你需要判断是否能够打开该房门。 输入描述 测试数据共有多组。 第一行为一个整数 s&#xff0c;表示共有多少组测试数据。 每组第一…

Windows 10系统用Xlight FTP搭建SFTP服务器

步骤&#xff1a; 1.安装SFTP服务器 刚开始我使用的是freeSSHd&#xff0c;后面发现由于公司网络原因&#xff0c;打不开这个软件&#xff0c;改成了使用Xlight FTP&#xff0c; 官网下载链接&#xff1a;Xlight FTP 服务器 - 下载免费的windows FTP 服务器 Xlight FTP有30…

tp8/6 插件PhpOffice\PhpSpreadsheet导入表格

一、安装 composer require phpoffice/phpspreadsheet 官网&#xff1a;phpoffice/phpspreadsheet - Packagist 二、代码 <?php namespace app\services\upload\model; use app\services\BaseServices; use \PhpOffice\PhpSpreadsheet\Spreadsheet; use \PhpOffice\Php…

Keras内置数据集

目录 1、MNIST数字分类数据集 2、CIFAR10小图像分类数据集 3、CIFAR100小图像分类数据集 4、IMDB电影评论情感分类数据集 参数说明 imdb_word_index.json 示例 5、路透社新闻专线分类数据集 reuters_word_index.json 6、Fashion MNIST数据集 7、加州房价回归数据集 …

React16源码: createRef与forwardRef源码实现

ref 概述 拿一个场景举例开始 比如&#xff0c;在react当中写一个组件&#xff0c;类型是 class Component在 render function 里面渲染一系列的子组件或者 dom节点会有这样的需求&#xff0c;就是获取某个dom节点或某个子组件的实例来做一些手动的操作不局限于 props 更新这种…

JVM:字节码

JVM&#xff1a;字节码 前言1. JVM概述 前言 1. JVM概述 1. JVM vs JDK vs JRE JVM Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;&#xff0c;目的是…

实现文本 内容展开 / 收起

<template><el-table :data"tableData" style"width: 100%" height"250"><el-table-columnfixedprop"date"label"日期"width"150"></el-table-column><el-table-columnprop"name…

正向代理和反向代理的区别

我们作为用户是操作客户端的&#xff0c;所以对于客户端的代理就是正向的。牢记&#xff0c;我们是正向的&#xff0c;我们是正向的&#xff0c;我们是正向的。 正向代理和反向代理都是网络中常见的代理服务类型&#xff0c;它们在网络通信中的角色和功能有所不同。 正向代理&…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

【数据湖架构】数据湖101:概述

数据湖是非结构化和结构化数据池&#xff0c;按原样存储&#xff0c;没有特定的目的&#xff0c;可以建立在多种技术上&#xff0c;如Hadoop&#xff0c;NoSQL&#xff0c;Amazon Simple Storage Service&#xff0c;关系数据库或各种组合根据一份名为“什么是数据湖”的白皮书…

微软截图工具SnippingTool_6.1.7601免费版

SnippingTool是一款win7系统自带的一款非常实用型截图工具&#xff0c;操作简单&#xff0c;点击“新建"可一键截图&#xff0c;截图之后会弹出编辑器&#xff0c;可以进行一些简单的勾画编辑操作&#xff0c;您可以使用笔、荧光笔、电子邮件或保存等选项。如果您的系统丢…