1. 程式人生 > >Python 中使用 pyrex 生成 Linux 可執行檔案

Python 中使用 pyrex 生成 Linux 可執行檔案

 這個問題是相當有意義的,如果有了比較好的方法,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)