1.C調用python
其實C與python的互動很簡單,最簡單的就是下面的例子:
1 Py_Initialize();2 3 PyRun_SimpleString("str = \"hello\"");4 PyRun_SimpleString("print str");5 6 Py_Finalize();
與C在進入main函數前要做一些準備工作一樣,所有要與python進行互動的程式開頭都是以Py_Initialize()開頭,無非就是申請一些預備的資源,結尾用Py_Finalize()釋放申請的資源,C程式在main函數完畢後也會進行資源的申請釋放,只不過C程式都是編譯器幫我們處理好的
上面的代碼其實就是在python的解譯器裡面輸入
str = "hello"
print str
跟你利用IDLE進行輸入差不多
在我們進行函數調用的時候,我們需要知道函數名,函數的形參,以及函數的傳回值,C調用python函數的過程也大抵如此
python程式:
1 def hello(i):2 print i3 return i
1 Py_Initialize(); 2 3 PyObject *pyMod = PyImport_ImportModule("test2"); 4 PyObject *pyFunc = PyObject_GetAttrString(pyMod,"hello"); 5 6 PyObject *pyParams = PyTuple_New(1); //申請tuple用以傳入參數 7 PyObject *pyValue = PyString_FromString("2"); 8 PyTuple_SetItem(pyParams,0,pyValue); 9 10 pyValue = PyObject_CallObject(pyFunc,pyParams);11 12 if (pyValue)13 {14 int pRet = PyFloat_AsDouble(pyValue);16 }17 Py_Finalize();
在我們調用python的函數的時候,我們需要知道函數所在的模組,這個就是PyImport_ImportModule的作用,引入test2模組(為什麼不是直接test,因為python自身有test,如果你引入test那麼你會找不到hello函數),跟你在python程式裡面import一樣,然後我們再利用PyObject_GetAttrString來擷取這個模組中的函數,如果我們需要傳入參數我們可以使用python中的Tuple,這讓我想起了erlang,在 eshell裡面一般也是通過列表來進行傳參,然後我們通過PyObject_CallObject來調用函數,函數的傳回值會儲存在PyObject_CallObject的傳回值裡面,我們通過PyFloat_AsDouble來擷取傳回值(這個的傳回值是2)
這樣簡單的C調用python的程式互動就完成了,當然上面為了方便我沒有對錯誤進行檢查
至於python的指令碼,我還是比較建議介面不要寫得太複雜,就像erlang建議提供給別人的介面一樣,一般一個模組裡面就start和end,這樣即使以後出錯,也方便調試
還有就是在提供給使用者的的時候,不一定要提供py檔案,只要提供pyc檔案就可以了
2.Python調用C程式
其實可以直接看collshell的部落格,有個簡單的例子
http://coolshell.cn/articles/671.html
不過在windows平台下需要注意,如果你的編譯檔案是cpp結尾的,那麼需要在函數前面加上extern "C",如果C++比較熟悉的應該知道為什麼,畢竟C++需要支援函數重載