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

罗索

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

jackyhwei 发布于 2010-06-03 21:05 点击:次 
python与c++交互学习入门之5 这次讲讲,如何扩展c++库。通过boost.python把c++库编译成python能够调用的dll。 通过上一次的教程后,大家都应该会使用boost.pytho
TAG:

python与c++交互学习入门之5

这次讲讲,如何扩展c++库。通过boost.python把c++库编译成python能够调用的dll。


通过上一次的教程后,大家都应该会使用boost.python了。把c++程序编译成pyd文件。由于c++有很多特性,所以,如果你的程

序用了很多的c++特性的话,那么你必须做很多工作了。像虚拟函数,函数重载,继承,默认值等等。具体如何转化,请参

boost.python的文档了。


这几天尝试着把c++程序库编译成python可调用的dll,不知道为什么一直不可用。。很是郁闷。老是显示如下的错误:

  1. Traceback (most recent call last): 
  2.   File "<pyshell#3>", line 1in <module> 
  3.     import pydll 
  4. ImportError: No module named pydll 

意思是说找不到dll。我把dll都copy到python/dlls下了还是不行,而且我确定python的sys.path包含了python/dlls目录了。

很是不解。网上也很难找到资料,google了很长时间找不到有用的资料,好像中文方面的资料很少的。今天尝试了一下google

英文资料,终于有了新的发现:
http://mail.python.org/pipermail/c++-sig/2007-February/011971.html
You are using Python2.5. In this version of Python you have to have file extension to be "pyd" - sge.pyd

--
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/

有人碰到的问题跟我的是一样的。后面那个Roman回答了一下,是文件扩展名的问题!!!为什么不支持dll呢?不解。回去试

了一下把后缀名改了就成功了。。。why???


下面来看一下我的那个简单的例子:
这个例子来自于网上,
http://www.vckbase.com/document/viewdoc/?id=1540
C++ 扩展和嵌入 Python
作者:胡金山
源码下载地址:http://www.vckbase.com/code/downcode.asp?id=2777

这是一个非常简单的dll工程。给python提供了一个函数static PyObject* Recognise(PyObject *self, PyObject *args)。

1、不使用boost.python库来直接构建dll
接下来,我们来用C++为Python编写扩展模块(动态链接库),并在Python程序中调用C++开发的扩展功能函数。生成一个取名为

pyUtil的Win32 DLL工程,除了pyUtil.cpp文件以外,从工程中移除所有其它文件,并填入如下的代码:

  1. // pyUtil.cpp 
  2. #ifdef PYUTIL_EXPORTS 
  3. #define PYUTIL_API __declspec(dllexport) 
  4. #else 
  5. #define PYUTIL_API __declspec(dllimport) 
  6. #endif 
  7.  
  8. #include<windows.h> 
  9. #include<string> 
  10. #include<Python.h> 
  11. BOOL APIENTRY DllMain( HANDLE hModule, 
  12.                        DWORD  ul_reason_for_call, 
  13.                        LPVOID lpReserved 
  14.         ) 
  15.     switch (ul_reason_for_call) 
  16.     { 
  17.     case DLL_PROCESS_ATTACH: 
  18.     case DLL_THREAD_ATTACH: 
  19.     case DLL_THREAD_DETACH: 
  20.     case DLL_PROCESS_DETACH: 
  21.         break
  22.     } 
  23.     return TRUE; 
  24. std::string Recognise_Img(const std::string url) 
  25.     //返回结果 
  26.     return "从dll中返回的数据... : " +url; 
  27. static PyObject* Recognise(PyObject *self, PyObject *args) 
  28.     const char *url; 
  29.     std::string sts; 
  30.     if (!PyArg_ParseTuple(args, "s", &url)) 
  31.         return NULL; 
  32.     sts = Recognise_Img(url); 
  33.     return Py_BuildValue("s", sts.c_str() ); 
  34. static PyMethodDef AllMyMethods[] = { 
  35.     {"Recognise",  Recognise, METH_VARARGS},//暴露给Python的函数 
  36.     {NULL,      NULL}        /* Sentinel */ 
  37. }; 
  38. extern "C" PYUTIL_API void initpyUtil() 
  39.     PyObject *m, *d; 
  40.     m = Py_InitModule("pyUtil", AllMyMethods); //初始化本模块,并暴露函数 
  41.     d = PyModule_GetDict(m); 

Python代码中调用这个动态链接库: (记得把dll的扩展名改为.pyd,另外dll的路径要能够被检索到)

  1. import pyUtil 
  2. result = pyUtil.Recognise("input url of specific data"
  3. print "the result is: "+ result 

2、使用boost.python库来构建dll
用C++为Python写扩展时,如果您愿意使用Boost.Python库的话,开发过程会变得更开心J,要编写一个与上述pyUtil同样功能的动态链接库,只需把文件内容替换为下面的代码。当然,编译需要boost_python.lib支持,运行需要boost_python.dll支持。

  1. #include<string> 
  2. #include <boost/python.hpp> 
  3. using namespace boost::python; 
  4. #pragma comment(lib, "boost_python.lib") 
  5. std::string strtmp; 
  6. char const* Recognise(const char* url) 
  7.     strtmp ="从dll中返回的数据... : "
  8.     strtmp+=url; 
  9.     return strtmp.c_str(); 
  10. BOOST_PYTHON_MODULE(pyUtil) 
  11.     def("Recognise", Recognise); 

可以非常明显地看到,用了boost.python库之后,简单了很多。因为boost.python为你做了很多的事情。。恩。好像没有讲很多有用的东西,光顾着讲了,呵呵。。。我也还在继续学习之中。下次写点什么呢?继续学习了哦

原文:http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html

 

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