摘要:在 Mac 下使用 Cython 會碰到一些意外。例如連結命令不一樣什麼的。本文就此簡單舉了一個例子來說明在 Mac OS X 中使用 Cython 的正確姿勢。
安裝 Cython
首先,我們需要安裝 Cython。Cython 是一個 Python 的擴充套件元件,可以將符合 Cython 語法的 Python 程式碼翻譯成 C 語言程式碼。如同在其他所有系統中安裝 Python 擴充套件元件一樣,只需要一行命令即可。
pip install cython
當然,前提是我們需要有 pip
。不過對於玩 Python 的各位,想必 pip
是必不可少了啦,如果沒有的話……谷歌之後,馬上回來~~
編寫 Cython 程式
有了 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 三分鐘入門。