C++调用Python Win10 Miniconda虚拟环境配置

2023-11-03

前言

本文记录了Win10 系统下Qt 应用程序调用Python时配置Miniconda虚拟环境的过程及遇到的问题,通过配置Python虚拟环境,简化了Qt应用程序的部署。

1. Win10 安装 Miniconda

首先下载Windows 版Miniconda,https://docs.conda.io/en/latest/miniconda.html
在这里插入图片描述
下载完成后,双击安装,选择安装位置,然后一直点下一步,安装完成后在开始菜单中增加了两个打开Miniconda终端的菜单项,如下图
在这里插入图片描述

2. 创建虚拟环境

新建Qt工程pythondemo,在pro文件中添加程序生成目录 DESTDIR

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += console
TARGET = pythondemo
TEMPLATE = app
DESTDIR = $$PWD/bin

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

编译并运行程序,可以看到在bin目录下生成了可执行程序。在bin目录下新建python目录,然后在开始菜单中找到 **Anaconda Prompt(miniconda3)**打开一个Python终端,默认激活的是base虚拟环境。使用如下命令创建指定路径,指定Python版本的虚拟环境:

conda create --prefix  C:\develop\QT\pythondemo\bin\python\env python=3.8

激活虚拟环境:

 conda activate C:\develop\QT\pythondemo\bin\python\env   

虚拟环境中默认安装了pip,可以使用pip install xxxpackage 命令安装Python依赖包。
在这里插入图片描述

3. 配置C++调用python环境

首先修改pro文件,添加 Python 头文件的路径和依赖的lib库,并将bin/python/env目录下的python38.dll 和 python3.dll复制到bin目录下。pro文件增加如下配置

INCLUDEPATH += $$PWD/bin/python/env/include
LIBS += -L$$PWD/bin/python/env/libs \
        -lpython38 -lpython3

初始化 Python 环境,并在程序中设置 PythonHome 环境变量,如何知道PythonHome环境变量需要设置哪些路径呢?这里需要参考虚拟环境的环境变量值。在激活的 bin\python\env 虚拟环境下运行Python解释器,打印虚拟环境的path值,如下图所示:
在这里插入图片描述

在代码中设置PythonHome 并初始化Python环境,代码如下:

    QString pythonHome = qApp->applicationDirPath() + "/python/env";
    pythonHome.append(";");
    pythonHome.append(qApp->applicationDirPath() + "/python/env/python38.zip");
    pythonHome.append(";");
    pythonHome.append(qApp->applicationDirPath() + "/python/env/DLLs");
    pythonHome.append(";");
    pythonHome.append(qApp->applicationDirPath() + "/python/env/lib");
    pythonHome.append(";");
    pythonHome.append(qApp->applicationDirPath() + "/python/env/lib/site-packages");
    
    wchar_t pythonHomeWchar[1500];
    memset(pythonHomeWchar, 0, sizeof(pythonHomeWchar));
    pythonHome.toWCharArray(pythonHomeWchar);
    //设置PythonHome环境变量
    Py_SetPythonHome(pythonHomeWchar);
    //初始化Python C API
    Py_Initialize();
    if(Py_IsInitialized())
    {
        qDebug() << "python env init !";
    }

4. C++调用Python带参函数

创建testPython.py文件,并添加一个带参数的测试函数,如下

def writeData(data):
	print(data)

下面的代码演示了如何设置应用程序python脚本路径,导入Python模块,获取模块中定义的函数,设置函数参数及调用函数。

 //应用程序python脚本路径
    QString pyfilePath = QString::fromLocal8Bit("sys.path.append('%1')").arg(qApp->applicationDirPath() + "/python");
    PyRun_SimpleString(pyfilePath.toLocal8Bit().data());

    //导入python模块
    PyObject* pWriteWordModule = PyImport_ImportModule("testPython");
    if(!pWriteWordModule)
    {
        qDebug() << "import module faild!";
        PyErr_Print();
    }
    //获取testPython模块中的函数
    PyObject *pFunc = PyObject_GetAttrString(pWriteWordModule, "writeData");
    if(!pFunc)
    {
        qDebug() << "get func faild!";
    }
    
    //设置函数参数
    PyObject *pTuple = PyTuple_New(1);
    PyTuple_SetItem(pTuple, 0, Py_BuildValue("s", "hello python !"));

    //调用函数
    PyObject_CallObject(pFunc, pTuple);

5.遇到的问题

在配置好pro文件编译qt工程时遇到如下图所示的错误,原因是object中定义的slots与qt的slots定义冲突,解决方法是添加下面第二张图所示的两行代码,先取消slots宏定义,然后再重新define,可解决这个问题。
在这里插入图片描述

在这里插入图片描述

6. 总结

以上就是本文的所有内容了,完整的demo可以从这里下载C++调用Python Miniconda虚拟环境,如果对C++调用Python环境配置有任何疑问,欢迎留言讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++调用Python Win10 Miniconda虚拟环境配置 的相关文章

  • Spark 和 Python 使用自定义文件格式/生成器作为 RDD 的输入

    我想问一下 Spark 中输入的可能性 我可以看到从http spark apache org docs latest programming guide html http spark apache org docs latest pro
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • 带 Flask 的 RPI dht22:无法将第 4 行设置为输入 - 等待 PulseIn 消息超时

    我正在尝试制作一个 Raspberry Pi 3 REST API 使用 DHT22 提供温度和湿度 整个代码 from flask import Flask jsonify request from sds011 import SDS01
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 移动APP专项测试

    什么是移动端测试 移动端测试是指对移动应用进行的测试 即实体的特性满足需求的特性 简言之就是针对移动平台的软件进行的测试 比如针对手机 ipad等平台上的各种app功能和性能展开的测试 相较于传统的web端的测试 移动端的测试受手机屏幕大小
  • 127.0.0.1和localhost的区别

    要比较两个东西有什么不同 首先要弄清两者的概念 所以 我们从概念开始 localhost 也叫local 正确的解释是 本地服务器 127 0 0 1 在windows等系统的正确解释是 本机地址 本机服务器 我们再看看他们的工作原理 lo
  • 关于块元素和行元素之间的转换

    如何让块元素变成行元素 将块级元素设置为行内元素 inline 可以通过以下几种方式 1 display inline 这个是最直接的方式 通过设置display样式为inline 可以将块级元素变为行内元素 例如 css div disp
  • element的日期组件-两个的和单个的组件

    dateOne vue
  • 云计算技术基础第1章 云的概念以及类型

    章节安排 第一章 云的概念及类型 第二章 虚拟化技术 第三章 云计算的架构和国内外研究现状 第四章 云计算与大数据 第五章 海量数据存储技术 第六章 云平台应用 本章内容 计算模式的回顾 云计算概念与特征 云计算的分类 云计算的发展动因 云
  • Spring Cloud Alibaba 大型微服务项目实战

    作者介绍 程序员十三 多年一线开发经验 历任高级开发工程师 后端主程 技术部门主管等职位 同时也是开源项目的爱好者和贡献者 掘金优秀作者 CSDN 博客专家 实体图书作者 专栏作者 视频讲师 小册介绍 Spring Cloud Alibab
  • 利用Python通过频谱分析和KNN完成iphone拨号的语音识别

    最近这段时间 学校里的事情实在太多了 从七月下旬一直到八月底实验室里基本天天十二点或者通宵 实在是没有精力和时间来写博客 这周老师出国开会 也算有了一个短暂的休息机会 刚好写点有意思的东西 上周在天津的会议上碰到一个北交的姐们儿 她想利用小
  • IDEA集成Git操作

    IDEA集成Git操作 IDEA绑定Git仓库 在需要的工程目录下创建Git仓库并完成仓库基本设置 此时IDEA界面出现的变化 若出现此变化 说明IDEA绑定Git仓库成功 IDEA集成的Git操作 右上角选项为Git基本操作 懒人操作 文
  • EMQX v4 安装及组建集群、设置负载均衡

    准备工作 操作系统ubuntu 16 04 虚拟机VMware Workstation 12 Pro 一 安装EMQX 1 打开EMQ首页 https www emqx io cn 2 选择产品 gt EMQ X Broker 3 在ubu
  • 机试复试准备中--梦校(华科)真题

    一 矩阵转置 二 统计单词 写法一 读取一整行 写法二 依次读入每一个单词 三 二叉排序树 DFS 四 IP地址 五 特殊排序 六 a b 高精度加法 七 奇偶校验 八 最大的两个数 九 二叉树遍历 DFS 十 成绩排序 十一 守形数 十二
  • vue:webpack打包过程中的常见错误-加载CSS文件

    问题1 ReferenceError dirname is not defined 解决方法 将 dirname写为 dirname 注意是两条 问题2 npm ERR code ERESOLVE npm ERR ERESOLVE unab
  • C# 任意开次方,次幂, 开平方,开三次方,平方根, 三次方根

    double a 0 开任意次方的关键是 1 0 2 必须写 0 点零 如果不写 就永远等于1 具体原因不清楚 可以测试代码 a Math Pow 2 1 2 可以跟开平方对比一下 开平方 平方根 a Math Pow 2 1 0 2 开任
  • c# yield 用法

    返回类型必须为 IEnumerable IEnumerable
  • 洛谷 P3374 【模板】树状数组 1

    题目链接 https www luogu com cn problem P3374 include
  • 标签平滑(label smoothing)

    目录 1 标签平滑主要解决什么问题 2 标签平滑是怎么操作的 3 标签平滑公式 4 代码实现 标签平滑 label smoothing 出自GoogleNet v3 关于one hot编码的详细知识请见 One hot编码 1 标签平滑主要
  • HDMI与TMDS接口

    目录 0 Xilinx的HDMI 1 4 2 0 Transmitter Subsystem Product Guide 1 HDMI是新一代的多媒体接口标准 2 HDMI向下兼容DVI 3 TMDS 最小化传输差分信号 4 TMDS编码算
  • DB2多行转一行【XML方式】

    分组然后合并 然后去除XML标签 SELECT replace replace replace xml2clob xmlagg xmlelement name A 字段 a 分隔符 a a from 表 group by 分组字段 如 SE
  • python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真

    TLV协议是一种通讯协议 一般将数据封装成TLV的形式 即Tag Length Value 协议就是指通信双方对数据传输控制的一种规定 规定了数据格式 同步方式 传送速度 传送步骤的问题作出统一的规定 可以理解为两个节点之间为了协同工作 协
  • Elasticsearch实战(十五)---查询query,filter过滤,结合aggs 进行局部/全局聚合统计

    Elasticsearch实战 查询query filter过滤 结合aggs 进行局部 全局聚合统计 文章目录 Elasticsearch实战 查询query filter过滤 结合aggs 进行局部 全局聚合统计 1 准备数据 2 ES
  • C++调用Python Win10 Miniconda虚拟环境配置

    目录 前言 1 Win10 安装 Miniconda 2 创建虚拟环境 3 配置C 调用python环境 4 C 调用Python带参函数 5 遇到的问题 6 总结 前言 本文记录了Win10 系统下Qt 应用程序调用Python时配置Mi