1.為什麼要嵌入python?
這個問題問的好,一般靜態語言與腳本語言(不僅僅是python),相互搭配,有兩種方式,一種是用c語言寫好模塊,然後用python去整合,也被稱之為擴展python,這樣的好處是即有python的靈活性,又有c語言的效率,還有一種就是c語言嵌入python,這樣我們就有了一個python解釋器了,在游戲編程中常用這種方法,如果你是用靜態語言編程,那麼修改一些屬性,就意為著重新編譯,如果程序很大的話,編譯是一間令人很煩的事,編譯起來非常慢,一種好的設計是把一些屬性寫在一個初始化文件中,然後在程序中去解析這個屬性文件,不過這樣還是不夠靈活,更加靈活的方式,就是干脆嵌入python(游戲編程中常用lua),這樣,游戲更有創造性,更容易擴展。
2.一個"錯誤的"例子
下面先把C代碼寫出來,(當然,直接編譯肯定是錯的,因為我們還有許多東西沒設置)
main.c
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString("print 'hello,python!'");
Py_Finalize();
return 0;
}
Py_Initialize()和Py_Finalize()就是初始化和結束python解釋器,PyRun_SimpleString()就在運行一段python語句,(好像表達式不行...)
你一定覺得你沒有Python.h這個頭文件,所以你不得不安裝一個叫python-dev的東西,直接sudo apt-get python-dev好了
現在我們試著編譯一下,
gcc -o main.c main
編譯錯誤,它找不到Python.h,它當然找不到,我們雖然已經下載安裝了,但是gcc並不能找到,我們需要告訴它,這就要用到gcc 的 -I選項
"-I 在頭文件的搜索路徑列表中添加dir目錄。" --- man 關於gcc -I選項的說明
我們繼續嘗試編譯:
gcc -I/usr/include/python2.6 main.c -o main
然後你會看到一大堆的錯誤
undefined reference to
恩,鏈接錯誤,他們並沒有找到庫的實現
你需要這樣編譯
gcc -I/usr/include/python2.6 -lpython2.6 main.c -o main
這次就沒問題了。
實際上我們更常見的做法是寫一個python模塊,然後導入,調用它,
看這個代碼:
Test.py
def hello():
print "nihao"
main.c
#include <Python.h>
#include <stdio.h>
int main()
{
Py_Initialize();
PyObject *pModule = NULL;
PyObject *pFunc = NULL;
pModule = PyImport_ImportModule("Test");
pFunc = PyObject_GetAttrString(pModule, "hello");
PyEval_CallObject(pFunc,NULL);
Py_Finalize();
return 0;
}