C調用Python的函數

來源:互聯網
上載者:User

Python是簡單的,Python又是強大的。
剛接觸Python的人都會有這麼一個疑問:Python到底有什麼用。不過要知道它能做什麼,還得先學會使用它。Python的文法相當簡單,這裡有一個教程:http://woodpecker.org.cn/abyteofpython_cn/chinese/,相信你一兩天就能對Python輕車熟路。
我的大部分時間都是用C開發的,所以,在C中調用Python是我比較關心的話題。看了一些網上前輩們的代碼大致上也有一個整體的認識。
1. 設定編譯環境,其實就是設定Python的標頭檔和庫檔案目錄
2. 初始化Python解譯器:
   Py_Initialize();
3. 調用Python
4. 釋放資源
   Py_Finalize();

我們重點要說的是第三步,調用Python。在C中,我們可以直接調用Python的指令碼,也可以調用Python中的函數。
1. 直接調用Python腳步,可以使用函數:PyRun_SimpleString()。
2. 調用Python中的函數。關鍵問題是C中的類型怎麼傳遞到Python中去,為此Python提供了這樣的一個函數:
   PyObject* Py_BuildValue(const char *format, ...);
   PyObject* Py_VaBuildValue(const char *format, va_list vargs );
   這些函數的具體使用,可以參照Python的說明。
  
   這裡我實現了一個函數來簡單的調用Python中的函數:

View Code

 1 /*
2 module: Python腳步的模組名
3 function: 要調用的函數名
4 format: 傳遞給Py_VaBuildValue函數的可變參數模板
5 */
6 int PyCall( const char * module, const char * function, const char *format, ... )
7 {
8 PyObject* pMod = NULL;
9 PyObject* pFunc = NULL;
10 PyObject* pParm = NULL;
11 PyObject* pRetVal = NULL;
12
13 //匯入模組
14 if( !(pMod = PyImport_ImportModule(module) ) ){
15 return -1;
16 }
17 //尋找函數
18 if( !(pFunc = PyObject_GetAttrString(pMod, function) ) ){
19 return -2;
20 }
21
22 //建立參數
23 va_list vargs;
24 va_start( vargs, format );
25 pParm = Py_VaBuildValue( format, vargs );
26 va_end(vargs);
27
28 //函數調用
29 pRetVal = PyEval_CallObject( pFunc, pParm);
30
31 //假定傳回值為整形
32 int ret;
33 PyArg_Parse( pRetVal, "i", &ret );
34 return ret;
35 }
36
37 int main(int argc, char* argv[])
38 {
39 Py_Initialize();
40
41 /* 這做個簡單的說明
42 ** format參數用()擴起來是表示元組的意思。元組中的個數對應Python指令碼中的參數。
43 ** 因為fun,fun1,fun2函數的參數個數分別是 0,1,2,所以,元組中的個數必須為0,1,2,不然調用將失
44 ** 敗。當然,元組中的每個元素都是可以為任意的類型,比如:
45 ** PyCall( "pytest", "fun2", "( i,{s:s,s:s})", 2, "name", "linxr", "age", "25" );
46 */
47 printf( "ret = %d\n", PyCall( "pytest", "fun", "()" );
48 printf( "ret = %d\n", PyCall( "pytest", "fun1", "(i)", 12 );
49 printf( "ret = %d\n", PyCall( "pytest", "fun2", "(is)", 12, "12" );
50
51 Py_Finalize();
52
53 return 0;
54 }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.