阅 读 文 章

C++ 扩展和嵌入 Python

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(不详) | 时间:2007-07-07 | 浏览:人次 ]



执行一段Python代码。

pstr = PyRun_String("message", Py_eval_input, pdict, pdict);
6. int PyArg_Parse( PyObject *args, char *format, ...)

解构Python数据为C的类型,这样C程序中才可以使用Python里的数据。例:

/* convert to C and print it*/PyArg_Parse(pstr, "s", &cstr);printf("%s\n", cstr);
7. PyObject* PyObject_GetAttrString( PyObject *o, char *attr_name)

返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句:o.attr_name。例:

/* to call mymod.transform(mymod.message) */pfunc = PyObject_GetAttrString(pmod, "transform");
8. PyObject* Py_BuildValue( char *format, ...)

构建一个参数列表,把C类型转换为Python对象,使Python可以使用C类型数据,例:

cstr="this is hjs''s test, to uppercase";pargs = Py_BuildValue("(s)", cstr);
9. PyEval_CallObject(PyObject* pfunc, PyObject* pargs)

此函数有两个参数,都指向Python对象指针,pfunc是要调用的Python 函数,通常可用PyObject_GetAttrString()获得;pargs是函数的参数列表,通常可用Py_BuildValue()构建。例:

pstr = PyEval_CallObject(pfunc, pargs);PyArg_Parse(pstr, "s", &cstr);printf("%s\n", cstr);
10. void Py_Finalize( )

关闭Python解释器,释放解释器所占用的资源。例:

Py_Finalize();

Python2.4环境没有提供调试版本的Python24d.lib,所以上述示例在release模式下编译。编译完成后,把可行文件和附2给出的mymod.py文件放在一起,再点击即可运行。为了简化编程,附3 给出了simplepy.h。这样,调用mymod.transform变成如下形式:

//#include”simplepy.h”CSimplepy py;py.ImportModule("mymod");std::string str=py.CallObject("transform", "this is hjs''s test, to uppercase");printf("%s\n", str.c_str());

接下来,我们来用C++为Python编写扩展模块(动态链接库),并在Python程序中调用C++开发的扩展功能函数。生成一个取名为pyUtil的Win32 DLL工程,除了pyUtil.cpp文件以外,从工程中移除所有其它文件,并填入如下的代码:

// pyUtil.cpp#ifdef PYUTIL_EXPORTS#define PYUTIL_API __declspec(dllexport)#else#define PYUTIL_API __declspec(dllimport)#endif#include<windows.h>#include<string>#include<Python.h>BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved                    ?){    switch (ul_reason_for_call)    {    case DLL_PROCESS_ATTACH:    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:        break;    }    return TRUE;}std::string Recognise_Img(const std::string url){    //返回结果    return "从dll中返回的数据... : " +url;}static PyObject* Recognise(PyObject *self, PyObject *args){    const char *url;    std::string sts;    if (!PyArg_ParseTuple(args, "s", &url))        return NULL;    sts = Recognise_Img(url);    return Py_BuildValue("s", sts.c_str() );}static PyMethodDef AllMyMethods[] = {    {"Recognise",  Recognise, METH_VARARGS},//暴露给Python的函数    {NULL,      NULL}        /* Sentinel */};extern "C" PYUTIL_API void initpyUtil(){    PyObject *m, *d;    m = Py_InitModule("pyUtil", AllMyMethods); //初始化本模块,并暴露函数    d = PyModule_GetDict(m);}

论坛热门帖子: [lch203] 写得蛮好的linux学习笔记(10-21)
[黑马制造] 学习java的30个目标(10-19)
[笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19)
[udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18)
[沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18)
TAG标签: 扩展 Python PyObject 可以 函数 char 文件 功能 调用

上一篇:探索 Python 类型的层次结构

下一篇:没有了

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.