本人是用vc2003 python2.5学习的,其它的也应该差不了多少 0. 坏境设置 1. 开始编程了 2. 看一个很简单的例子 #Filename test.py 这个应该能看懂的吧?否则的话,回去再练练python吧,呵呵。《简明Python教程》Swaroop, C. H. 著。沈洁元 译。
#include PyObject * pModule = NULL; pModule = PyImport_ImportModule('test'); Py_Finalize(); return 0; 第一步还是包含头文件 第二步,使用python之前,要调用Py_Initialize();这个函数进行初始化。 反正,一开始你一定要调用。 第三步,声明一些Python的变量,PyObject类型的。其实声明也可放在前面,这个倒是无所谓的。 第四步,import module,也就是你的脚本名字,不需要加后缀名,否则会出错的。 第五步,从你import进来的module中得到你要的函数 第六步,调用PyEval_CallObject来执行你的函数,第二个参数为我们要调用的函数的函数,本例子不含参数,所以设置为NULL。 第七步,调用Py_Finalize,这个根Py_Initialize相对应的。一个在最前面,一个在最后面。 第一次写教程。这个例子非常简单,本人也还在学习当中阿,只能保证大家能够把这个例子运行起来。建议大家去看python的documentaion,里面有讲怎么embedding python的。先写到这里,其实目前也只学到这么多,呵呵。下次学了更多以后再写。Over。恩。 1. 一个有一个参数的例子 python文件 def Hello(s): cpp文件 PyObject * pModule = NULL; pModule = PyImport_ImportModule('test2'); PyEval_CallObject(pFunc, pArg); Py_Finalize(); return 0; 注意,参数要以tuple元组形式传入。因为这个函数只要一个参数,所以我们直接使用(s)构造一个元组了。 2. 一个有两个参数的例子 python文件中加入以下代码,一个加函数 cpp文件,只改了两行,有注释的那两行 PyObject * pModule = NULL; pModule = PyImport_ImportModule('test2'); PyEval_CallObject(pFunc, pArg); Py_Finalize(); return 0; 其它的就类似了。。。基本上,我们知道了怎么在c 中使用python中的函数。接下来学习一下如何使用python中的 class。 附:Py_BuildValue的使用例子,来自python documentation: Py_BuildValue('') None 这次主要讲讲怎么把python中的class嵌入到c 中去。 1. 首先讲讲元组的操作 来自python doc的一个例子 #include if (argc < 3) { Py_Initialize(); pModule = PyImport_Import(pName); if (pModule != NULL) { if (pFunc && PyCallable_Check(pFunc)) {
def printName(self): cpp文件 PyObject * pModule = NULL; pModule = PyImport_ImportModule('test2'); pFunc = PyObject_GetAttrString(pObject, 'printName');//得到该实例的成员函数 Py_Finalize(); return 0;
3. 编译python源代码 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。恩。 坏境python25 vs2005 (2005真耗资源阿。。。) 有一段时间没写blog了。这几天都在研究怎么封装c ,让python可以用c 的库。在网上发现了boost.python这个好咚咚。不 过在使用过程中碰到一点问题。本文教大家如何把 char const* greet() 封装成python。实际上这是python教程里面的咚咚。
boost/boost_1_34_0/下。记得一定要用visual studio 2005 command prompt这个vs2005带的tools,不要用cmd.exe,否则会 碰到很多错误的。然后就是把bjam.exe拷贝到一个能被找到的目录下,或者直接也拷贝到boost/boost_1_34_0/下即可。然后, 设置python的根目录和python的版本,也可直接把它们加到坏境目录中,那样就不用每次都设置一下。 接着就可以直接运行了,bjam -sTOOLS=vc-8_0 成功之后,就会有好多个boost_python-vc80-****.dll,.lib的,把他们都拷贝到一个能被系统找到的目录,不妨直接把他们都 扔到c:/windows/system32下。 接着,我们开始编译hello。navigation到boost/boost_1_34_0/libs/python/example/tutorial下,bjam -sTOOLS=vc-8_0运行 ,在bin的目录下即会生成hello.pyd。这下就基本成功了,如果没成功的话,check一下上面boost_python的那些dll能否被系 统找到。另外,这里有python25的一个bug。。。我花了很长时间才在python的mail lists中找到了。寒。。。 错误如下所示: 解决办法如下: 。 编译成功后会产生一个hello.pyd,在bin的目录下面。
。操作hello.pyd根其他python文件是一样的。 如果碰到如下错误,是因为系统找不到boost_python的dll。强烈建议把他们都扔到system32下!。 >>> import hello Traceback (most recent call last):
// Copyright Joel de Guzman 2002-2004. Distributed under the Boost char const* greet() #include BOOST_PYTHON_MODULE(hello)
先写到这里了。下次再写。。嗯 python与c 交互学习入门之5这次讲讲,如何扩展c 库。通过boost.python把c 库编译成python能够调用的dll。
序用了很多的c 特性的话,那么你必须做很多工作了。像虚拟函数,函数重载,继承,默认值等等。具体如何转化,请参 boost.python的文档了。
Traceback (most recent call last): 意思是说找不到dll。我把dll都copy到python/dlls下了还是不行,而且我确定python的sys.path包含了python/dlls目录了。 很是不解。网上也很难找到资料,google了很长时间找不到有用的资料,好像中文方面的资料很少的。今天尝试了一下google 英文资料,终于有了新的发现: -- 有人碰到的问题跟我的是一样的。后面那个Roman回答了一下,是文件扩展名的问题!!!为什么不支持dll呢?不解。回去试 了一下把后缀名改了就成功了。。。why???
pyUtil的Win32 DLL工程,除了pyUtil.cpp文件以外,从工程中移除所有其它文件,并填入如下的代码: // pyUtil.cpp #include 在Python代码中调用这个动态链接库: (记得把dll的扩展名改为.pyd,另外dll的路径要能够被检索到) 2、使用boost.python库来构建dll 的动态链接库,只需把文件内容替换为下面的代码。当然,编译需要boost_python.lib支持,运行需要boost_python.dll支持 。 可以非常明显地看到,用了boost.python库之后,简单了很多。因为boost.python为你做了很多的事情。。恩。 |
|