C++调Python,代码粘贴如下:

  1. #include <iostream>
  2. #include <Python.h>
  3.  
  4. using namespace std;
  5.  
  6. void HelloWorld();
  7. void Add();
  8. void TestTransferDict();
  9. void TestClass();
  10.  
  11. int main()
  12. {
  13. cout << "Starting Test..." << endl;
  14.  
  15. cout << "HelloWorld()-------------" << endl;
  16. HelloWorld();
  17. cout << "Add()--------------------" << endl;
  18. Add();
  19. cout << "TestDict-----------------" << endl;
  20. TestTransferDict();
  21. cout << "TestClass----------------" << endl;
  22. TestClass();
  23.  
  24. system("pause");
  25. return 0;
  26. }
  27.  
  28. //调用输出"Hello World"函数
  29. void HelloWorld()
  30. {
  31. Py_Initialize(); //使用python之前,要调用Py_Initialize();这个函数进行初始化
  32. PyObject * pModule = NULL; //声明变量
  33. PyObject * pFunc = NULL; //声明变量
  34. pModule =PyImport_ImportModule("Test001"); //这里是要调用的Python文件名
  35. pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名
  36. PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空
  37. Py_Finalize(); //调用Py_Finalize,这个和Py_Initialize相对应的.
  38. }
  39.  
  40. //调用Add函数,传两个int型参数
  41. void Add()
  42. {
  43. Py_Initialize();
  44.  
  45. PyObject * pModule = NULL;
  46. PyObject * pFunc = NULL;
  47. pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
  48. pFunc= PyObject_GetAttrString(pModule, "add"); //Add:Python文件中的函数名
  49.   //创建参数:
  50. PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数
  51. PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号 i表示创建int型变量
  52. PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号
  53.   //返回值
  54. PyObject *pReturn = NULL;
  55. pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数
  56.   //将返回值转换为int类型
  57. int result;
  58. PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量
  59. cout << "5+7 = " << result << endl;
  60.  
  61. Py_Finalize();
  62. }
  63.  
  64. //参数传递的类型为字典
  65. void TestTransferDict()
  66. {
  67. Py_Initialize();
  68.  
  69. PyObject * pModule = NULL;
  70. PyObject * pFunc = NULL;
  71. pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
  72. pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
  73.   //创建参数:
  74. PyObject *pArgs = PyTuple_New(1);
  75. PyObject *pDict = PyDict_New(); //创建字典类型变量
  76. PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据
  77. PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据
  78. PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中
  79.   //返回值
  80. PyObject *pReturn = NULL;
  81. pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数
  82.   //处理返回值:
  83. int size = PyDict_Size(pReturn);
  84. cout << "返回字典的大小为: " << size << endl;
  85. PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");
  86. int newAge;
  87. PyArg_Parse(pNewAge, "i", &newAge);
  88. cout << "True Age: " << newAge << endl;
  89.  
  90. Py_Finalize();
  91. }
  92.  
  93. //测试类
  94. void TestClass()
  95. {
  96. Py_Initialize();
  97.  
  98. PyObject * pModule = NULL;
  99. PyObject * pFunc = NULL;
  100. pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名
  101. pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名
  102.   //获取Person类
  103. PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");
  104. //创建Person类的实例
  105. PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);
  106. //调用方法
  107. PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty"
  108.  
  109. Py_Finalize();
  110. }

  Python代码如下:

  1. #test.py
  2. def HelloWorld():
  3. print "Hello World"
  4. def add(a, b):
  5. return a+b
  6. def TestDict(dict):
  7. print dict
  8. dict["Age"] = 17
  9. return dict
  10. class Person:
  11. def greet(self, greetStr):
  12. print greetStr
  13. #print add(5,7)
  14. #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示例(转载)的更多相关文章

  1. py_initialize:C调Python出错 是初始化错误?

    还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...

  2. Nginx 简单的负载均衡配置示例(转载)

    原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...

  3. python 示例代码1

    第一章 python基础一 ​在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...

  4. 使用minidom来处理XML的示例(Python 学习)(转载)

    作者网站:http://www.donews.net/limodou/archive/2004/07/15/43609.aspx  一.XML的读取.在 NewEdit 中有代码片段的功能,代码片段分 ...

  5. Perf -- Linux下的系统性能调优工具,第 2 部分 特殊用法以及内核调优示例

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ 本文内容简介 之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序 ...

  6. python "yield"(转载)

    转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...

  7. JDK记录-JVM原理与调优(转载)

    转载自<https://www.cnblogs.com/andy-zhou/p/5327288.html> 一.什么是JVM JVM是Java Virtual Machine(Java虚拟 ...

  8. XGBOOST应用及调参示例

    该示例所用的数据可从该链接下载,提取码为3y90,数据说明可参考该网页.该示例的“模型调参”这一部分引用了这篇博客的步骤. 数据前处理 导入数据 import pandas as pd import ...

  9. Python深入:Distutils发布Python模块--转载

    https://blog.csdn.net/gqtcgq/article/details/49255995 Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Pyth ...

随机推荐

  1. 升级salt导致进程kill问题记录

    重启salt-minion导致由salt启动的进程kill问题排查 作者:耀耀 blog:https://www.liuyao.me 环境 服务器系统为centos6及centos7 服务器服务进程都 ...

  2. shell--read命令

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  3. Flask之笔记集合

    目录 一.简述 二.基本使用 三.配置文件 四.路由系统 2.自定义正则路由 五.模版语言 六.请求和响应 七.Session 2.自定义session 八.蓝图 九.message 十.中间件 十一 ...

  4. Team++_炸弹人软件需求说明书

    目标是什么,目标不包括什么? 目标是制造一款受青年人(大学生或中学生)喜爱的手机益智闯关游戏,可以用来打发时间或放松心情. 用户和典型场景是什么? 用户:学生 典型场景:在宿舍无聊时.在睡觉之前或在课 ...

  5. 第二阶段Sprint冲刺会议2

     进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写. 

  6. 四则运算<C++>

    代码: #include<iostream> #define N 30 using namespace std; void main() { cout<<"***** ...

  7. spring--两个数据源模板

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-met ...

  8. The user survey(用户调查)

    在周末,我们找了一些人来进行了一个调查,鉴于选择困难,我们只找到了几个真正的小学生,没有找到家长,其余那些都是找大学生来做调查的,我们和他们说,让他们把自己的立场看成是小学生或家长.下面是我们整理出来 ...

  9. Eclipse+MySQL+Tomcat web开发安装配置

    转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...

  10. beta——5

    一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 对用户功能的添加. (2) 今天计划完成的工作: web发布 (3) 工作中遇到的困 ...