2013年11月1日 星期五

[Python] Python/C API On Linux Mint

今天第一次嘗試使用 Python/C API

但是花了點時間處理 GCC 編譯器引入 Python.h 的問題
-----------------------------------------------------------------------------------

Python/C 是 Python 作為黏合語言的一個重點,要用 C 呼叫 Python 的模組,或是在 C 中使用 Python 語法,基本上需要透過這個 API ,其中有一個主要的 Header 叫做 Python.h,需要在其他標頭檔之前引入,接著就可以呼叫這個標頭檔中定義一些與 Python 有關的 C 函式了

我實驗的平台是 Linux Mint x86_64 3.8.0-19-generic 、Python 2.7.4、GCC 4.7.3



這台電腦中的  Python 沒有包含 Python.h 及其他相關的 Python Header,上網查可以很輕易找到要安裝 python-dev:sudo apt-get install python-dev,如此在 /usr/include/python2.7 裡面就有Python.h 了

然後我寫了以下的 C 範例 (python_in_c.c):

接著就很期待的要進行編譯:gcc -o a.out python_in_c.c
結果編譯錯誤!
訊息說找不到 Python.h,基本上網路上很多說安裝好 python-dev 以後就可以讓 C 編譯器在編譯時找到 Python.h 了

但我的結果是無法自動找到,進一步搜尋到相同狀況的文章說需要將路徑加入到 Compiler Search Path,所以我嘗試編譯時這樣:
gcc -I/usr/include/python2.7 -o a.out python_in_c.c
接著就有找到這個 header 了!

但是!還是有錯誤啊!訊息如下:
python_in_c.c:(.text ...): undefined reference to 'Py_Initialize'
python_in_c.c:(.text ...): undefined reference to 'PyRun_SimpleStringFlags'
python_in_c.c:(.text ...): undefined reference to 'Py_Finalize'

這樣不就還是沒有成功引入嗎?
因為我有去 trace Python.h ,有引入 pythonrun.h
PyRun_SimpleStringFlag 就在那裡面,怎麼會還是沒定義?

後來測試很久終於找到成功的敘述了:
gcc -I/usr/include/python2.7 -o a.out python_in_c.c -lpython2.7

這樣子除了找的到 header ,也可以通過編譯找到定義函式了

接著就可以執行產生的可執行擋了!

如果覺得每次都要打 -I/usr/include/python2.7 很瑣碎,我找到的作法是將這個路徑加到 C_INCLUDE_PATH 這個環境變數中,開啟 .bashrc 加入如下:
export C_INCLUDE_PATH="/usr/include/python2.7:$C_INCLUDE_PATH"





2 則留言:

  1. 但是你的用法跟通常反過來。你要去看一下一些 API 的 Class,比較實用。

    回覆刪除
    回覆
    1. OK,謝啦!
      我還要從基本開始學習 Python。

      刪除