发布于 2015-12-12 02:58:46 | 191 次阅读 | 评论: 0 | 来源: PHPERZ
Cython Python的C语言扩展
准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而 Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。
摘要:在 Mac 下使用 Cython 会碰到一些意外。例如链接命令不一样什么的。本文就此简单举了一个例子来说明在 Mac OS X 中使用 Cython 的正确姿势。
首先,我们需要安装 Cython。Cython 是一个 Python 的扩展组件,可以将符合 Cython 语法的 Python 代码翻译成 C 语言代码。如同在其他所有系统中安装 Python 扩展组件一样,只需要一行命令即可。
pip install cython
当然,前提是我们需要有 pip
。不过对于玩 Python 的各位,想必 pip
是必不可少了啦,如果没有的话……谷歌之后,马上回来~~
有了 Cython 之后,让我们来编写一个简单的 a+b
函数好了。
# file: a_plus_b.pyx
def a_plus_b(int a, int b):
cdef int c
c = a + b
return c
其中参数部分需要按照 C 语言的规范进行声明(似乎按照 Python 的规则直接写也是可以的),代码中的声明需要添加 cdef
。
接下来,我们来运行这个函数,当然是使用 Cython 的方法。
将 pyx
转换为 C
cython a_plus_b.pyx
此时会有 a_plus_b.c
生成。这个文件就是经过 Cython 翻译的代码。
编译 C
代码为链接库 so
此处代码请看完下面解释之后再执行,否则会出错 (:з」∠)
cc -c -fPIC -I/usr/local/include/python2.7 a_plus_b.c
cc -shared -lpython2.7 aa.o -o a_plus_b.so
其中第一行代码中需要指定一个 include
文件 Python.h
的位置。这里我们采用的是路径 /usr/local/include/python2.7
,这是我们自己设置的软链接。默认情况下,Mac OS X 中 Python.h
文件的位置在一个类似于如下路径的地方。
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
为了后续使用方便,我们建立一个软连接。
ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/ /usr/local/include/python2.7
这样,我们第一行的命令就可以正确执行啦~~执行之后会生成 a_plus_b.o
文件。
第二行中需要指定链接的 Python 版本,即 -lpython2.7
参数。执行之后会生成 a_plus_b.so
文件。
从 Python 中调用刚编译的库
此时,a_plus_b.so
中的函数已经可以直接被 import
。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import a_plus_b
print a_plus_b.a_plus_b(1, 2)
执行这段代码,会输出 3。
至此步骤全部完成~~
本文只是给出了一些在 Mac OS X 上使用 Cython 可能碰到的一些问题的解决方法。至于如何在 Cython 中使用 Python 库以及如何调用 C 语言库,详见 Cython 三分钟入门。