Python嵌入C++详解(1)--HelloWorld
来CSDN的时候,刚刚接触Python,那时候对Python的嵌入部分很感兴趣,只是一直没有时间来弄清其面纱,因此也一直没有使用嵌入的功能,另一个原因是我还没有真正用Python写过一个正式的有用点的东西,不过,现在回过头来继续看这一部分,发现还是挺简单的。以前想把这部分翻译出来,可是由于时间原因,也没有那精力,所以这里我会将我所探究的每个Python/C嵌入部分函数都用实例来说明,我想看代码比我解释要通俗易懂。
再说helloworld之前,先不得不提下嵌入的配置问题。
步骤:
1:请到官网下载python的安装程序,安装python(我想这步有点多余,不过还是写上吧)
2:接着你可能还需要下载python(与安装版本相同)源代码,因为我们需要在debug下编译链接生成对应的debug库,若你能在网上找到别人已经编译好的库,你也可以直接用别人的。这样得到2个debug版本的.lib和.dll
3:将python目录下的include文件夹下的文件移到编译系统的include中,然后将release和debug版本的.lib和.dll放到指定的文件夹中(lib放到编译系统lib,dll放到windows/system32/)
4:好了,配置就此完成了。
来看代码:
#include "python/python.h" //我是将python那些头文件放在我自己建的名为python的文件夹中
int main(int argc,char** argv)
{
Py_Initialize();//该函数启动python解释器,算是初始化
//载入文件的方式运行指令,FILE是C标准库stdio.h文件中的一个结构,习惯C语言的应该很熟悉(不过我还是第一次使用,汗...)
FILE * fr;
fopen_s(&fr,"test.txt","r");
PyRun_SimpleFile(fr,"test.txt");
fclose(fr);
//直接运行指令,指令都是字符串,注意3.1.1版的python必须加上小括号
PyRun_SimpleString("print('Hello world,I am python!')");
///
Py_Finalize(); //该函数关闭python解释器,算是扫尾
return 0;
}
//附带test.txt
/*
from time import time,ctime
print('Today is', ctime(time()))
*/
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/02/4511841.aspx
Python嵌入C++详解(2)--Import Module
首先,我不得不提到一个非常好的网站:http://www.codase.com/index.html
这是我在查找嵌入函数时发现的,里面有非常多的实例小代码,实在是相见恨晚啊(呵呵)
前面说明了嵌入需要的配置(见http://blog.csdn.net/xiadasong007/archive/2009/09/02/4511841.aspx),这次主要是为了说明如何在C/C++中调用Python模块中的函数的基本方法。
前置说明:
1:PyObject * obj这个东西有点像SDK中句柄的感觉。
2:调用Python模块流程:首先要载入模块,载入完后就可以直接访问了(⊙o⊙)哦~!很简单的~
好,来看代码:
#include "python/python.h"
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
PyObject *pModule, *pFunc, *pValue;
Py_Initialize();
pModule=PyImport_ImportModule("mat"); //mat是我自己用python写的一个小模块(mat.py),里面内容见后面附录
pValue=PyObject_CallMethod(pModule,"add","ii",10,20); //通过上面得到的模块直接访问模块里面的函数add(a,b)
//注意这里的"ii"事实上相当于C中的"%d%d"的功能,请参考文档
cout<<PyLong_AsLong(pValue)<<endl; //将得到的pValue值转换为C中的long型
pFunc=PyObject_GetAttrString(pModule, "add"); //也可以使用该函数得到函数对象
pValue=PyObject_CallFunction(pFunc,"ii",1,2); //通过函数对象执行函数
cout<<PyLong_AsLong(pValue)<<endl;
Py_Finalize();
return 0;
}
//附录:mat.py
/*
def add(a,b):
return a+b
*/
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/02/4512797.aspx
Python嵌入C++详解(3)--Import Class
继前篇《Import Module》(http://blog.csdn.net/xiadasong007/archive/2009/09/02/4512797.aspx),继续分析嵌入部分基础知识。这次不多说,有什么问题记得多查英文资料,国内的这方面知识少
还是来看代码,写完我就睡觉了~
#include "python/python.h"
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
PyObject *pModule, *pClass,*pStuObj,*pFunc;
Py_Initialize();
//载入模块stu.py
pModule = PyImport_ImportModule ("stu");
//从模块中得到类Student
pClass = PyObject_GetAttrString (pModule, "Student");
//生成一个学生对象jack,注意3.1版本必须加上小括号:(s),否则会出错
//PyObject_CallObject和另外一个常用的PyEval_CallObject用法极为相近,请看附录部分详解
PyObject * temp=Py_BuildValue("(s)","jack");
pStuObj = PyObject_CallObject(pClass, temp);
//获得函数对象jack中的成员函数printName,
//这个getattr的意思就是得到当前对象的属性(不要局限于C++中的属性哦)
pFunc= PyObject_GetAttrString (pStuObj, "printName");
//调用函数printName
PyEval_CallObject (pFunc, NULL);
Py_Finalize();
return 0;
}
/*
附录:
1:Student类,我发现print后面现在必须加上小括号了,否则会有问题
class Student:
name=""
def __init__(self,name):
self.name=name
def printName(self):
print (self.name)
2:PyObject_CallObject和 PyEval_CallObject不同之处:
可以看出,后者较为直接,而且接受NULL,and does explicit type checks
for args and kwds.
PyObject_CallObject(PyObject *o, PyObject *a)
{
! PyObject *r;
! PyObject *args = a;
!
! if (args == NULL) {
! args = PyTuple_New(0);
! if (args == NULL)
! return NULL;
! }
!
! r = PyEval_CallObject(o, args);
!
! if (args != a) {
! Py_DECREF(args);
! }
!
! return r;
}
PyObject_CallObject(PyObject *o, PyObject *a)
{
! return PyEval_CallObjectWithKeywords(o, a, NULL);
}
*/
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/03/4513615.aspx