现在的位置: 首页 > 综合 > 正文

c++调用python总结

2013年07月03日 ⁄ 综合 ⁄ 共 2165字 ⁄ 字号 评论关闭

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

 

 

 

抱歉!评论已关闭.