• C++调Python示例


    由于项目需要,最近几天都在研究怎么用C++调Python,现将这几天实验的代码粘贴如下:

    C++代码如下(Console应用程式):

      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代码如下:

    #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...")

    运行结果:

    注意事项:

    1.若编译Debug版,请将C:/Python26/libs下的python26.lib复制一份改名为python26_d.lib

    2.很奇怪,不能将python文件的名字命名为test.py,否则老是报错。????高人指点下




  • 相关阅读:
    HDFS DataNode 多目录
    HDFS DataNode 退役 旧节点
    HDFS DateNoda 服役 新节点
    HDFS DataNode 时限参数设置
    HDFS NameNode 多目录
    HDFS 安全模式
    HDFS NameNode故障排除
    HDFS CheckPoint时间设置
    HDFS NameNode和SecondaryNameNode
    微信小程序:上拉加载更多
  • 原文地址:https://www.cnblogs.com/Hisin/p/2370590.html
Copyright © 2020-2023  润新知