参考: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();