QT中 使用c++调用python
最近在做一个项目,开发环境用的是QT c++。项目中使用amazon云服务,调研发现有一个Amazon云的python接口。就有了标题中的问题,需要用C++来调用python脚本。
下面是一个c++调用python的小例子。我先贴出代码,然后在详细介绍。
# -*- coding: cp936 -*-
#定义hello函数,这个函数的功能是输出“hello world!”
def hello():
print("hello world!")
上面就是我们一会要用C++调用python脚本,你没看错,只有两行,是不是很简单,这也是我们为什么要调用Amazon云的python接口的原因。
#include <QCoreApplication>
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); //初始化python模块
Py_Initialize();
if ( !Py_IsInitialized() )
{
return -;
}
//导入test.py模块
PyObject* pModule = PyImport_ImportModule("test");
if (!pModule) {
printf("Cant open python file!\n");
return -;
}
//获取test模块中的hello函数
PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");
//注释掉的这部分是另一种获得test模块中的hello函数的方法
// PyObject* pDict = PyModule_GetDict(pModule);
// if (!pDict) {
// printf("Cant find dictionary.\n");
// return -1;
// }
// PyObject* pFunhello = PyDict_GetItemString(pDict, "hello"); if(!pFunhello){
cout<<"Get function hello failed"<<endl;
return -;
}
//调用hello函数
PyObject_CallFunction(pFunhello,NULL);
//结束,释放python
Py_Finalize();
return a.exec(); }
上面是C++调用python的代码。要想具体了解这些Py**函数,可以去看看python手册或者其他网络资源,我看的是这个http://segmentfault.com/a/1190000000531613
这个测试工程的结构如下图所示:

在运行之前需要进行配置,注意到main.cpp包含了一个Python.h的头文件,这是调用python脚本必须的,同时我们还要配置这个工程的.pro文件,将python的include和lib包含进来。
配置如下所示:

这样就可以调用python代码了吗?
来看看我们的运行结果:

可以看到,没有打开python文件,为什么呢?
这是因为生成的exe文件和tests.py文件不在同一个文件夹里,只要手动将test.py拷贝到exe文件同级目录下即可。
然后我们再来试下:

成功了!
就到这里了,有问题的地方欢迎指出。
QT中 使用c++调用python的更多相关文章
- 在go中通过cmd调用python命令行参数量级过大问题解决
问题描述如下: 在go中使用cmd调用python命令行 cmd := exec.Command("python", "dimine/Kriging/matrix.py& ...
- 在QT C++中调用 Python并将软件打包发布(裸机可运行)
为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...
- 在Java中调用Python
写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...
- Java调用Python脚本并获取返回值
在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...
- 中标麒麟(linux)下Qt调用python
转自:https://blog.csdn.net/lwlgzy/article/details/83857297 http://www.cnblogs.com/jiaping/p/6321859.ht ...
- Win10 + CLion + 树莓派 + QT 远程开发调用Python
原则:能在一个机器上开发的就不在两台机器上!! 首先需要配置远程QT开发环境 配置Cmake cmake_minimum_required(VERSION 3.14) project(qt_test) ...
- PyQt(Python+Qt)学习随笔:快速理解Qt 中Action是什么
一.引言 Qt中Action这个词接触很久了,一直以来没去学习,今天终于准备学习了,查了些资料,初步总结为: Action为界面操作的抽象,应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命 ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- C++中调用Python脚本
C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...
随机推荐
- Select算法(最坏复杂度O(n))
#include<iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm&g ...
- solr .Net端(SolrNet)
首先 引用SolrNet.dll Microsoft.Practices.ServiceLocation HttpWebAdapters 也可以用.net IDe 中的 nuget下载 solrnet ...
- async task 异步消息
async 和 await 是用来定义的异步方法,async 关键字是上下文关键字,原因在于只有当它修饰方法.lambda 表达式或匿名方法时,它才是关键字. 在所有其他上下文中,都会将其解释为标 ...
- virtualenv之python虚拟环境
virtualEnv可以方便的解决不同项目中,对类库的依赖问题.首先将常用的类库安装在系统环境中,然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环境中. virtualen ...
- uva-10167-枚举
题意:生日蛋糕上面有2N草莓,怎么切能够将蛋糕和草莓平分成俩份,直接枚举,A和B,草莓不能落在直线上 #include <iostream> #include <stdio.h> ...
- 13.mysql基本查询
1. 给表起个别名:但是,前面的也是需要进行修改的,否则会报错的: select * from s.name from students as s; 2. 为字段起别名 select s,name a ...
- ASP.NET CMS: Administration Template
ASP.NET CMS: Administration Template For many creating advanced ASP.NET website or application admin ...
- spring security 配置xml 参考
https://blog.csdn.net/zsq520520/article/details/77880491
- HTTPS 路径配置
1: 首先安装 fiddlercertmaker.exe 文件 2:Tools -> HTTPS 3: Connections 勾中Allow remote computer to ...
- bat 笔记 一
echo 有两个参数 off 和 on 注意echo前面要加个@才生效 当 @echo off的时候就是将doc命令将前面的路径去掉,默认其实就是@echo on显示路径: 默认的状态: 输入@ech ...