Python 中使用 pyrex 生成 Linux 可執行檔案
阿新 • • 發佈:2018-12-29
這個問題是相當有意義的,如果有了比較好的方法,Python 完全可以用來開發商業軟體,而不用擔心原始碼洩露。
前兩天我在網上看了看,有很多的人在問這個問題。大部分的人都在用 py2exe,這是個對 Python 程式打包的東東,實際上只是在 Python 程式中找 出依賴的模組,然後釋出這個程式。好處在於可以讓這個程式脫離 Python 的環境來執行,不用安裝 Python 直譯器。但實際上並不能保護原始碼,因為源 程式碼其實也包含在其中了。更好的辦法是使用 Pyrex。在 http: //www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ 可以下載到。本來 Pyrex
是一個用來混合 編寫 Python 和 C 程式的東西,然後轉換為 C 程式碼,再編譯成可執行檔案。於是這裡就相當於提供了一種方法可以將 Python 程式碼轉換為 C 程式碼,這樣就可 以把 Python 程式編譯為真正的可執行檔案了!下面說說怎麼做。假設我們有一個簡單的 Python 程式,程式碼如下,假設檔名為 go.py。
def add(a, b):
print a+b # 為了方便看到函式呼叫,輸出一下
retur a+b
僅僅做一個簡單的加法操作。那我們想把它編譯為可執行檔案的話,需要進行以下幾步:
1.修改 go.py 檔案,在裡面新增一個 c 函式,當然要用 Pyrex 的語法,用這個函式來呼叫 Python 程式的入口函式(在這裡就是 add 了)。修改 go.py 為 go.pyx。
在這裡就是新增一個:
cdef public int c_add(int a, int b):
return add(a, b)
2.新增一個頭檔案 go.pxi, 讓主函式能找到 go.py 裡的 C 函式的申明
cdef extern int (c_add(int, int))
3.編寫一個主函式檔案 main.c,在該主函式中包含 go.h (這個檔案會自動生成), 並呼叫前面設計的 C 函式。
#include <stdio.h> #include <string.h> #include <Python.h> #include "go.h" int main(int argc, char *argv[]) { Py_Initialize(); initgo(); // 這個地方的函式名字為init加上模組名,就是原來那個py檔案的名字 c_add(2, 5); Py_Finalize(); return 0; }
好了,現在編譯就是:
pyrexc go.pyx gcc go.c main.c -I/usr/include/python2.5 -L/usr/lib/ -lpython2.5 -o go
就生成了叫 go 的可執行檔案,執行它,就得到了想要的結果!注:此方法我只在 linux 上試過。(That's enough. - cloud)