C++程式員學Python:C與Python進行互動

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.