首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++调用python小结

2012-12-18 
c++调用python总结参考:http://blog.csdn.net/marising/article/details/2917892http://blog.csdn.net/win

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();

 

 

 

热点排行