C++调Python示例(转载)
C++调Python,代码粘贴如下:
- #include <iostream>
- #include <Python.h>
- using namespace std;
- void HelloWorld();
- void Add();
- void TestTransferDict();
- void TestClass();
- int main()
- {
- cout << "Starting Test..." << endl;
- cout << "HelloWorld()-------------" << endl;
- HelloWorld();
- cout << "Add()--------------------" << endl;
- Add();
- cout << "TestDict-----------------" << endl;
- TestTransferDict();
- cout << "TestClass----------------" << endl;
- TestClass();
- system("pause");
- return 0;
- }
- //调用输出"Hello World"函数
- void HelloWorld()
- {
- Py_Initialize(); //使用python之前,要调用Py_Initialize();这个函数进行初始化
- PyObject * pModule = NULL; //声明变量
- PyObject * pFunc = NULL; //声明变量
- pModule =PyImport_ImportModule("Test001"); //这里是要调用的Python文件名
- pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名
- PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空
- Py_Finalize(); //调用Py_Finalize,这个和Py_Initialize相对应的.
- }
- //调用Add函数,传两个int型参数
- void Add()
- {
- Py_Initialize();
- PyObject * pModule = NULL;
- PyObject * pFunc = NULL;
- pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
- pFunc= PyObject_GetAttrString(pModule, "add"); //Add:Python文件中的函数名
- //创建参数:
- PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数
- PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号 i表示创建int型变量
- PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号
- //返回值
- PyObject *pReturn = NULL;
- pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数
- //将返回值转换为int类型
- int result;
- PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量
- cout << "5+7 = " << result << endl;
- Py_Finalize();
- }
- //参数传递的类型为字典
- void TestTransferDict()
- {
- Py_Initialize();
- PyObject * pModule = NULL;
- PyObject * pFunc = NULL;
- pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
- pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
- //创建参数:
- PyObject *pArgs = PyTuple_New(1);
- PyObject *pDict = PyDict_New(); //创建字典类型变量
- PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据
- PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据
- PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中
- //返回值
- PyObject *pReturn = NULL;
- pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数
- //处理返回值:
- int size = PyDict_Size(pReturn);
- cout << "返回字典的大小为: " << size << endl;
- PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");
- int newAge;
- PyArg_Parse(pNewAge, "i", &newAge);
- cout << "True Age: " << newAge << endl;
- Py_Finalize();
- }
- //测试类
- void TestClass()
- {
- Py_Initialize();
- PyObject * pModule = NULL;
- PyObject * pFunc = NULL;
- pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
- pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
- //获取Person类
- PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");
- //创建Person类的实例
- PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);
- //调用方法
- PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty"
- Py_Finalize();
- }
Python代码如下:
- #test.py
- def HelloWorld():
- print "Hello World"
- def add(a, b):
- return a+b
- def TestDict(dict):
- print dict
- dict["Age"] = 17
- return dict
- class Person:
- def greet(self, greetStr):
- print greetStr
- #print add(5,7)
- #a = raw_input("Enter To Continue...")
运行结果:
第一步还是包含头文件
第二步,使用python之前,要调用Py_Initialize();这个函数进行初始化。
帮助文档中如是说:
The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path).
反正,一开始你一定要调用。
第三步,声明一些Python的变量,PyObject类型的。其实声明也可放在前面,这个倒是无所谓的。
第四步,import module,也就是你的脚本名字,不需要加后缀名,否则会出错的。
第五步,从你import进来的module中得到你要的函数
pFunc = PyObject_GetAttrString(pModule, "函数名");
上面的例子已经够清楚的了,最后一个是你要得到的函数的名字
第六步,调用PyEval_CallObject来执行你的函数,第二个参数为我们要调用的函数的函数。
第七步,调用Py_Finalize,这个根Py_Initialize相对应的。一个在最前面,一个在最后面。
注意事项:
1.若编译Debug版,请将C:/Python26/libs下的python26.lib复制一份改名为python26_d.lib
原博地址:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html
另外还有一篇写的很好,地址:https://www.cnblogs.com/earvin/p/5423868.html
C++调Python示例(转载)的更多相关文章
- py_initialize:C调Python出错 是初始化错误?
还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- python 示例代码1
第一章 python基础一 在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...
- 使用minidom来处理XML的示例(Python 学习)(转载)
作者网站:http://www.donews.net/limodou/archive/2004/07/15/43609.aspx 一.XML的读取.在 NewEdit 中有代码片段的功能,代码片段分 ...
- Perf -- Linux下的系统性能调优工具,第 2 部分 特殊用法以及内核调优示例
https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ 本文内容简介 之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序 ...
- python "yield"(转载)
转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...
- JDK记录-JVM原理与调优(转载)
转载自<https://www.cnblogs.com/andy-zhou/p/5327288.html> 一.什么是JVM JVM是Java Virtual Machine(Java虚拟 ...
- XGBOOST应用及调参示例
该示例所用的数据可从该链接下载,提取码为3y90,数据说明可参考该网页.该示例的“模型调参”这一部分引用了这篇博客的步骤. 数据前处理 导入数据 import pandas as pd import ...
- Python深入:Distutils发布Python模块--转载
https://blog.csdn.net/gqtcgq/article/details/49255995 Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Pyth ...
随机推荐
- 升级salt导致进程kill问题记录
重启salt-minion导致由salt启动的进程kill问题排查 作者:耀耀 blog:https://www.liuyao.me 环境 服务器系统为centos6及centos7 服务器服务进程都 ...
- shell--read命令
read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...
- Flask之笔记集合
目录 一.简述 二.基本使用 三.配置文件 四.路由系统 2.自定义正则路由 五.模版语言 六.请求和响应 七.Session 2.自定义session 八.蓝图 九.message 十.中间件 十一 ...
- Team++_炸弹人软件需求说明书
目标是什么,目标不包括什么? 目标是制造一款受青年人(大学生或中学生)喜爱的手机益智闯关游戏,可以用来打发时间或放松心情. 用户和典型场景是什么? 用户:学生 典型场景:在宿舍无聊时.在睡觉之前或在课 ...
- 第二阶段Sprint冲刺会议2
进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写.
- 四则运算<C++>
代码: #include<iostream> #define N 30 using namespace std; void main() { cout<<"***** ...
- spring--两个数据源模板
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...
- The user survey(用户调查)
在周末,我们找了一些人来进行了一个调查,鉴于选择困难,我们只找到了几个真正的小学生,没有找到家长,其余那些都是找大学生来做调查的,我们和他们说,让他们把自己的立场看成是小学生或家长.下面是我们整理出来 ...
- Eclipse+MySQL+Tomcat web开发安装配置
转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...
- beta——5
一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 对用户功能的添加. (2) 今天计划完成的工作: web发布 (3) 工作中遇到的困 ...