读书人

c++调用python小结

发布时间: 2012-12-18 12:43:41 作者: rapoo

c++调用python总结

参考:http://blog.csdn.net/marising/article/details/2917892

http://blog.csdn.net/winsunxu/article/details/7050047

环境:vs2010,python2.6,系统win7

最近使用python一个库,用c++如何调用它,搞得我晕头转向。c++调用python的方式我知道的有两种

(1)boost库的方式

(2)python提供API的方式

我采用了第二种方式。

一、环境的搭建

1、首先在工程的C++目录包含python安装目录的include文件夹

2、修改include目录下的pycofig文件

主要解决fatal error LNK1104: 无法打开文件“python26_d.lib”的解决

(1)修改

# ifdef _DEBUG
# pragma comment(lib,"python26_d.lib")
# else
# pragma comment(lib,"python26.lib")

修改为

# ifdef _DEBUG
# pragma comment(lib,"python26.lib")
# else
# pragma comment(lib,"python26.lib")
# endif /* _DEBUG */

(2)注释代码块

#ifdef _DEBUG
# define Py_DEBUG
#endif

注释掉

/*
#ifdef _DEBUG
# define Py_DEBUG
#endif
*/

不注释的话,到时调用函数会有内存错误的问题。

二、调用示例

(1)首先#include "Python.h"

(2)在你工程目录下创建second.py文件,文件内容如下(格式一定得注意,python对格式要求比较严格)

class Person:
def sayHi(self):
print 'hi'
class Second:
def invoke(self,obj):
obj.sayHi()
def sayhi(name):
print 'hi',name
class Testobj(object):
def __init__(self, initstring=None, **kwargs):
print 'success'
def test(self, d1,d2):
return(d1, d2,)

(3)person类的调用

http://blog.csdn.net/marising/article/details/2917892里面有这个调用方式更详细的说明

(4)比较麻烦的是Testobj(object)类的调用,这类和person类不同,故调用方式也不同

Py_Initialize();
if(!Py_IsInitialized())
return -1;

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

//导入模块
PyObject* pModule=PyImport_ImportModule("second");
if(!pModule)
{
printf("Cant open python file!\n");
return -1;
}

//模块的字典列表
PyObject* pDict = PyModule_GetDict(pModule);
if(!pDict)
{
printf("Cant find dictionary.\n");
return -1;
}

//获取TestObj类
PyObject* pClassSecond = PyDict_GetItemString(pDict,"TestObj");
if( !pClassSecond )
{
printf("Cant find second class.\n");
return -1;
}


//构造TestObj的实例

//**kwargs必须以这种形式构建

PyObject *pdata=Py_BuildValue("{s:s}","tt","ss");

//空值必须要构建这种形式

PyObject *argObject=Py_BuildValue("()");

//得使用PyObject_Call

PyObject*pInstanceSecond= PyObject_Call(pClassSecond, argObject, pdata);

Py_DECREF(pdata);

Py_DECREF(argObject);


if( !pInstanceSecond)
{
printf("Cant create second instance.\n");
return -1;
}

//得使用PyObject_CallMethod

PyObject *re= PyObject_CallMethod(pInstanceSecond,"test","dd",200.0,180.0);

double d1=0,d2=0;

int ok=-3;

ok= PyArg_ParseTuple(re,"dd",&d1,&d2);

Py_DECREF(re);

Py_DECREF(pDict);

Py_DECREF(pInstanceSecond);

Py_DECREF(pClassSecond);

Py_DECREF(pModule);

Py_Finalize();

读书人网 >C++

热点推荐