zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    选择HttpHandler还是HttpModule?
    细说 ASP.NET Cache 及其高级用法
    写自己的ASP.NET MVC框架(下)
    写自己的ASP.NET MVC框架(上)
    细说Cookie
    用Asp.net写自己的服务框架
    我心目中的Asp.net核心对象
    HttpModule与HttpHandler详解
    对协变和逆变的简单理解
    .net项目技术选型总结
  • 原文地址:https://www.cnblogs.com/findumars/p/5554054.html
Copyright © 2011-2022 走看看