c++调用python

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++调用python相关的知识,希望对你有一定的参考价值。

便以前的注意事项:

1.包含Python目录下的include和libs

2.拷贝 python27.dll为python27_d.dll

3.python的文件名字不能为test.py,避免发生未知错误

 

本文章来自网络收集,为了方便所以源码也不是本人的

 

[cpp] view plain copy
 
  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] view plain copy
 
    1. def HelloWorld():    
    2.     print "Hello World"    
    3. def add(a, b):    
    4.     return a+b    
    5. def TestDict(dict):    
    6.     print dict    
    7.     dict["Age"] = 17    
    8.     return dict    
    9. class Person:    
    10.     def greet(self, greetStr):    
    11.         print greetStr    
    12. #print add(5,7)    
    13. #a = raw_input("Enter To Continue...")  

http://blog.csdn.net/singleroot/article/details/42105907

以上是关于c++调用python的主要内容,如果未能解决你的问题,请参考以下文章

[转]Linux下Python与C++混合编程

pythonpython魔法方法(待填坑)

Head First PythonPython I/O

深入理解pythonpython语法总结:基础知识和对python中对象的理解

PythonPython库之文本处理

PythonPython库之文本处理