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 i 3 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++需要支持函數重載