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