2015年3月10日 星期二

[Python] Learning Note 4 - Python with C

這次來記錄一下,Python 調用 C 的方式

環境是 : Python3.4.3-64bit、MinGW-64、Win7

< 前言 >

 一開始直接使用 Code::Blocks 附帶的 MinGW

即使後來可以編譯成功,程式執行的時候還是會錯誤

錯誤訊息 : ImportError: DLL load failed: %1 不是正確的Win32 應用程式

這是因為 Code::Blocks 的 MinGW 是 32bits 的,而自己裝的 Python 是 64bits 所造成的

< 正題 >

1. 到官網下載 MinGW-64

2. 安裝 MinGW-64,安裝配置如下


    最後把安裝路徑加到環境變數 path,例如

    D:\Program Files\mingw-w64\x86_64-4.9.2-posix-seh-rt_v3-rev1\mingw64\bin


3. 用 C 寫一個 Fabonacci 數列

#include <Python.h>

int Fibonacci(int n)
{
    if(n < 2)
    {
        return n;
    }
    else
    {
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
}

static PyObject *fib(PyObject *self, PyObject *args)
{
    int n;

    if(!PyArg_ParseTuple(args,"i", &n))
    {
        return NULL;
    }

    return Py_BuildValue("i",Fibonacci(n));
}

//{Python要使用的 methond 名稱, C 裡面的函式名稱, 參數傳遞方式, 用在Python 裡面的函式說明 __doc__}
static PyMethodDef myMethods [] =\
{
    {"fib",fib,METH_VARARGS,"費式數列"},
    {NULL, NULL,0,NULL}
};

static struct PyModuleDef myModule = \
{
    PyModuleDef_HEAD_INIT,
    "fib",
    NULL,
    -1,
    myMethods
};

PyMODINIT_FUNC PyInit_fib(void)
{
    return PyModule_Create(&myModule);
}

4. 寫一個相對應的 setup.py


5. 打開 cmd 到檔案所在路徑,輸入以下指令

python setup.py build --compiler=migw32

之後會在同路徑下生成一個 build 資料夾,裡面會有 lib.win-XXXX 的資料夾

將裡面的 pyd 檔案移出到和步驟6要寫的 py 檔同一地方

6. 寫一個 py 來使用 C 的函數


輸出結果



參考資料

1. http://www.xuebuyuan.com/898321.html
2. http://m.oschina.net/blog/291514

沒有留言:

張貼留言