织梦CMS - 轻松建站从此开始!

罗索

很好的c++和Python混合编程文章(3)

jackyhwei 发布于 2010-06-03 21:05 点击:次 
c++中嵌入python入门3 这次主要讲讲怎么把python中的class嵌入到c++中去。顺便讲讲元组的操作和怎么编译python源代码。 1. 首先讲讲元组的操作 由于参数是通过
TAG:

c++中嵌入python入门3

这次主要讲讲怎么把python中的class嵌入到c++中去。顺便讲讲元组的操作和怎么编译python源代码。

1. 首先讲讲元组的操作
由于参数是通过元组传进去的,所以我们不能老是通过Py_BuildValue这个函数来操作元组,那样太不方便了。
Python提供了元组相关的操作,下面这个例子演示了如何操作。主要是下面几个函数:

  1. //new一个元组,传入size 
  2. pArgs = PyTuple_New(argc - 3);  
  3. //set元组的直,第一个为元组,第二个为index(从0开始),第三个为value 
  4. PyTuple_SetItem(pArgs,0,Py_BuildValue("i",2000) ); 
  5. PyTuple_SetItem(pArgs,1,Py_BuildValue("i",8) ); 

来自python doc的一个例子

  1. #include <Python.h> 
  2. int main(int argc, char *argv[]) 
  3.     PyObject *pName, *pModule, *pDict, *pFunc; 
  4.     PyObject *pArgs, *pValue; 
  5.     int i; 
  6.  
  7.     if (argc < 3) { 
  8.         fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); 
  9.         return 1; 
  10.     } 
  11.  
  12.     Py_Initialize(); 
  13.     pName = PyString_FromString(argv[1]); 
  14.     /* Error checking of pName left out */ 
  15.  
  16.     pModule = PyImport_Import(pName); 
  17.     Py_DECREF(pName); 
  18.  
  19.     if (pModule != NULL) { 
  20.         pFunc = PyObject_GetAttrString(pModule, argv[2]); 
  21.         /* pFunc is a new reference */ 
  22.  
  23.         if (pFunc && PyCallable_Check(pFunc)) { 
  24.             pArgs = PyTuple_New(argc - 3); 
  25.             for (i = 0; i < argc - 3; ++i) { 
  26.                 pValue = PyInt_FromLong(atoi(argv[i + 3])); 
  27.                 if (!pValue) { 
  28.                     Py_DECREF(pArgs); 
  29.                     Py_DECREF(pModule); 
  30.                     fprintf(stderr, "Cannot convert argument\n"); 
  31.                     return 1; 
  32.                 } 
  33.                 /* pValue reference stolen here: */ 
  34.                 PyTuple_SetItem(pArgs, i, pValue); 
  35.             } 
  36.             pValue = PyObject_CallObject(pFunc, pArgs); 
  37.             Py_DECREF(pArgs); 
  38.             if (pValue != NULL) { 
  39.                 printf("Result of call: %ld\n", PyInt_AsLong(pValue)); 
  40.                 Py_DECREF(pValue); 
  41.             } 
  42.             else { 
  43.                 Py_DECREF(pFunc); 
  44.                 Py_DECREF(pModule); 
  45.                 PyErr_Print(); 
  46.                 fprintf(stderr,"Call failed\n"); 
  47.                 return 1; 
  48.             } 
  49.         } 
  50.         else { 
  51.             if (PyErr_Occurred()) 
  52.                 PyErr_Print(); 
  53.             fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); 
  54.         } 
  55.         Py_XDECREF(pFunc); 
  56.         Py_DECREF(pModule); 
  57.     } 
  58.     else { 
  59.         PyErr_Print(); 
  60.         fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); 
  61.         return 1; 
  62.     } 
  63.     Py_Finalize(); 
  64.     return 0; 

2. class操作
把下面加入到test2.py中去。定义了一个很简单的类,有一个name成员变量,一个printName成员函数

  1. class TestClass: 
  2.     def __init__(self,name): 
  3.         self.name = name 
  4.  
  5.     def printName(self): 
  6.         print self.name 

cpp文件

  1. #include <python.h> 
  2. int main() 
  3.  Py_Initialize(); 
  4.  
  5.  PyObject * pModule = NULL; 
  6.  PyObject * pFunc   = NULL; 
  7.  PyObject * pArg    = NULL; 
  8.  PyObject * pClass  = NULL; 
  9.  PyObject * pObject = NULL; 
  10.  
  11.  pModule = PyImport_ImportModule("test2"); 
  12.  pClass  = PyObject_GetAttrString(pModule, "TestClass");//得到那个类 
  13.  pArg = PyTuple_New(1); 
  14.  PyTuple_SetItem(pArg, 0, Py_BuildValue("s""Jacky")); 
  15.  pObject = PyEval_CallObject(pClass, pArg);//生成一个对象,或者叫作实例 
  16.  
  17.  pFunc = PyObject_GetAttrString(pObject, "printName");//得到该实例的成员函数 
  18.  PyEval_CallObject(pFunc, NULL);//执行该实例的成员函数 
  19.  
  20.  Py_Finalize(); 
  21.  
  22.  return 0; 

没有什么资料,就先写到这里了。下面介绍一下怎么build python25的源代码

3. 编译python源代码
为什么要编译呢?因为没有python25_d.lib!呵呵。顺便可以了解一下代码结构。
解压缩后,有好多目录,其中pcbuild和pcbuild8是我们要的。pcbuild对应着vc7.1的,pcbuild8对应着vc8.0的
因为在用vc7.1,也就是2003了。所以我就说说怎么用2003来编译吧。事实上是从一位牛人那里学来的

http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx,那位大哥大概一年半前就在解剖python了,厉害阿。看来我只能后来居上了,娃哈哈。我按照他说的试了一下,编译成功!

不过遇到一点小问题,用vc2003打开那个solution的时候,发现作者没有把source code control去掉,郁闷!害的我

们打开的时候一堆messagebox。不过不用管它就好了,一直确定。最后试了一下那个python25_d.lib,没问题。不过记

得把python25_d.dll copy到一个能被找到的目录,比如说c:\windows\system32\下面。python25.dll也在这个目录下

面。over。恩。 (jacky2019)

本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9574.html]
本文出处:cppblog.com 作者:jacky2019
顶一下
(4)
80%
踩一下
(1)
20%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容