C++调Python示例
来源:互联网 发布:西服 马甲 知乎 编辑:程序博客网 时间:2024/06/11 02:56
原文出自:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html
python 和C++ 混合编程案例,在这之前要把python的include/libs目录分别加到vc的include/lib directories中去。另外,由于python没有提供debug lib,体地说,就是没有提供python33_d.lib了,运行在release 下,如果想运行在debug下,复制python33.lib一份,改成python33_d.lib即可。
#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(); }
#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:/Python33/libs下的python33.lib复制一份改名为python33_d.lib
2.很奇怪,不能将python文件的名字命名为test.py,否则老是报错。????高人指点下
0 0
- C++调Python示例
- C++调Python示例
- python调用 C/C++ 代码示例
- 用C语言扩展Python的示例
- python调用c语言动态库示例
- XGBoost python调参示例
- Python示例
- C调用Python函数相关代码示例剖析
- linux平台下C语言调用python代码示例
- C调用Python函数相关代码示例剖析
- Protocol Buffers的安装使用和C++/Python入门示例
- python调用c/c++方式示例(修改整理)
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
- c示例
- 客户端回调实现 (C#) 示例
- 客户端回调实现 (C#) 示例
- 客户端回调实现 (C#) 示例
- 检验文件路径是否存在,若不存在则创建
- 播布客视频地址
- request获取表单
- winform 导出TXT
- 次方求模
- C++调Python示例
- 有趣与愉快-------罗辑思维整理
- 更安全的signal handling————使用Reentrant Function
- IOS成长之路-使用系统默认声音、震动
- CSS样式生成 多张图片合成为1张 制作过程 代码控制
- clob和blog在mysql数据库里的使用
- 一起学java设计模式--代理模式(结构型模式)
- Android Bitmap 全面解析(三)开源图片框架分析1-UIL(上) ...
- Apple Tree - POJ 3321 树状数组+离散化+N叉树