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. {
4. PyObject *pName, *pModule, *pDict, *pFunc;
5. PyObject *pArgs, *pValue;
6. int i;
7.
8. if (argc < 3) {
9. fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
10. return 1;
11. }
12.
13. Py_Initialize();
14. pName = PyString_FromString(argv[1]);
15. /* Error checking of pName left out */
16.
17. pModule = PyImport_Import(pName);
18. Py_DECREF(pName);
19.
20. if (pModule != NULL) {
21. pFunc = PyObject_GetAttrString(pModule, argv[2]);
22. /* pFunc is a new reference */
23.
24. if (pFunc && PyCallable_Check(pFunc)) {
25. pArgs = PyTuple_New(argc - 3);
26. for (i = 0; i < argc - 3; ++i) {
27. pValue = PyInt_FromLong(atoi(argv[i + 3]));
28. if (!pValue) {
29. Py_DECREF(pArgs);
30. Py_DECREF(pModule);
31. fprintf(stderr, "Cannot convert argument\n");
32. return 1;
33. }
34. /* pValue reference stolen here: */
35. PyTuple_SetItem(pArgs, i, pValue);
36. }
37. pValue = PyObject_CallObject(pFunc, pArgs);
38. Py_DECREF(pArgs);
39. if (pValue != NULL) {
40. printf("Result of call: %ld\n", PyInt_AsLong(pValue));
41. Py_DECREF(pValue);
42. }
43. else {
44. Py_DECREF(pFunc);
45. Py_DECREF(pModule);
46. PyErr_Print();
47. fprintf(stderr,"Call failed\n");
48. return 1;
49. }
50. }
51. else {
52. if (PyErr_Occurred())
53. PyErr_Print();
54. fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
55. }
56. Py_XDECREF(pFunc);
57. Py_DECREF(pModule);
58. }
59. else {
60. PyErr_Print();
61. fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
62. return 1;
63. }
64. Py_Finalize();
65. return 0;
66. }
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. {
4. Py_Initialize();
5.
6. PyObject * pModule = NULL;
7. PyObject * pFunc = NULL;
8. PyObject * pArg = NULL;
9. PyObject * pClass = NULL;
10. PyObject * pObject = NULL;
11.
12. pModule = PyImport_ImportModule("test2");
13. pClass = PyObject_GetAttrString(pModule, "TestClass");//得到那个类
14. pArg = PyTuple_New(1);
15. PyTuple_SetItem(pArg, 0, Py_BuildValue("s", "Jacky"));
16. pObject = PyEval_CallObject(pClass, pArg);//生成一个对象,或者叫作实例
17.
18. pFunc = PyObject_GetAttrString(pObject, "printName");//得到该实例的成员函数
19. PyEval_CallObject(pFunc, NULL);//执行该实例的成员函数
20.
21. Py_Finalize();
22.
23. return 0;
24. }
没有什么资料,就先写到这里了。下面介绍一下怎么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。恩。