您的位置:首页 > 编程语言 > C语言/C++

用C语言扩展python笔记

2009-12-12 17:25 169 查看
这是我的笔记,侧重于pyd模块的生成,仅供参考。

Python是如此的优雅,但有时也会到些性能问题,笔者最近就遇到一个。这时可以选择用C来扩展(好吧,其实也可以用C++),开始吧!

第一步:准备代码

比如经典的helloworld函数,然后需要把这个函数封装成python可以理解的样子。如何写封装代码参考 <<python 文档-> Extending and Embedding the Python Interpreter>>
需要注意的:
1.python的每一个元素都是对象,就算是1,函数返回时需要包装成python能理解的方式。
2.如果需要生成一个叫demo的模块,模块的初始化函数必须是initdemo(因为import时,会运行 init+模块名 这个函数)

第二步:编译并生成链接模块

把写好的代码文件转成python文件可以import的格式,linux下是.so文件,windows下是.pyd文件。

Unix环境

利用distutils,写个setup.py,然后python setup.py build
参考<<python 文档-> Extending and Embedding the Python Interpreter-> Building C and C++ Extensions with distutils >>

Windows环境

笔者找到了两个方法。

方法一:使用vc/vs

比如VS2005
1.建一个空的项目:新建项目->Win32项目->DLL.
2.设置路径:工具->选项->项目和解决方案->VC++目录。将python/include加入包含文件,python/libs加入库文件。
3.设置为release版,并生成解决方案(选release是因为python中可能不包含debug需要的文件),这时我们就可以在项目release目录下找一个dll的文件。但需要的是pyd,怎么办?直接手动改成pyd就行了。
一些遇到的问题:
1.vs和gcc的语法标准不一样
2.vs的初始化函数 前面需要加 __declspec(dllexport),因为据说编译的时候会把初始化函数改名,如果不加,在import的时候就找会不到初始化函数。

方法二:使用gcc/g++

vc,vs确实是很好的C/C++编译环境,但不是每个人都喜欢它,特别是unix用户,所以就找了个用gcc编译pyd的方法。
1.在windows下安装Cygwin
这是一个在windows下模拟linux的软件
注意:在选择安装包的时候,装上gcc,但不要安装python
安装好后,打开Cygwin shell,试试python命令能不能用。如果你没有在Cygwin安装python,python命令也可以用,说明他用的是你windows上面的python了,这正是想要的结果。(也有的说可以通过修改cygwin中python的路径达到这个目的,或者修改bin中可执行文件python的名字,达到相同的目的)
提示:可以通过env查看环境变量,还可以直接做cd d:直接访问windows文件系统(不用先mount)

2.对gcc.exe做些修改
(假如cygwin安装在C:/rhcygwin)如果可以使用C:/rhcygwin/bin/gcc.exe 去编译代码,跳过。
如果提示有权限问题,查看gcc.exe这个文件是不是只有56个字节,并可以用vim或ue等打开,里面会有个“symlink”字符串。说是这是一个linux下的快捷方式,window无法识别。用旁边的gcc-3.exe,或者gcc-4.exe替换成gcc.exe 就行(g++也一样),相关帖子:
/article/4664069.html

3.生成相应的库文件进入windows下python/libs目录,会发现有一个python26.lib(如果是版本),据说windows下的python/libs没有提供linux可用的库,所以需要手动生成一个
下载一个dll2def: http://home.trouwweb.nl/Jerry/packages.html
利用这个工具 生成一个.def文件: $ dll2def python26.dll >python21.def
然后生成一个.a库文件(linux版的lib):
$ dlltool --dllname python26.dll --def python26.def --output-lib libpython21.a
想debug的话好像还得复制一个文件:
$ cp libpython26.a libpython26_d.a
4.进入C:/rhcygwin/bin(假如cygwin安装在C盘),
然后就可以重复利用setup.py了,不过命令稍微有些不同,这次是直接生成pyd
python setup.py build --compiler=mingw32
相关帖子: http://code.activestate.com/recipes/82826/
好了,第二种方法有点麻烦,不过搞完后就能继续享受命令行的快乐了,还是值得试一试的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: