2015-01-14 52 views
-1

有人請向我解釋一下如何將嵌入式Python的變量傳遞給我的C程序? 我在網上隨處看,我發現我不明白,因爲我知道很少的Python。將變量從嵌入式Python傳遞給C

我試圖在C中創建一個回調函數,但我不明白它應該如何工作。

現在,我的主程序在C.我在那裏創建一個Python對象並在一個線程中調用Python腳本中的Python函數。這個函數產生的值和這些值我需要傳回C程序以備後用。

+0

我不明白你的問題,你能舉一個例子嗎,你已經試過了什麼? –

+0

http://stackoverflow.com/questions/27940739/embedding-python-in-c-and-continuesly-pass-values-from-a-python-loop-to-the-c-pr 這是我的初始問題,但我沒有得到任何答案,只是幾個意見,所以我想Id試圖問一個非常簡單的問題..感謝downvoting。 – user3030653

回答

0

嵌入,我會建議瞭解一下Python網站上的文檔:https://docs.python.org/3.4/extending/embedding.html#pure-embedding

這是你的興趣的部分是:

if (pModule != NULL) { 
    pFunc = PyObject_GetAttrString(pModule, argv[2]); 
    /* pFunc is a new reference */ 

    if (pFunc && PyCallable_Check(pFunc)) { 
     pArgs = PyTuple_New(argc - 3); 
     for (i = 0; i < argc - 3; ++i) { 
      pValue = PyLong_FromLong(atoi(argv[i + 3])); 
      if (!pValue) { 
       Py_DECREF(pArgs); 
       Py_DECREF(pModule); 
       fprintf(stderr, "Cannot convert argument\n"); 
       return 1; 
      } 
      /* pValue reference stolen here: */ 
      PyTuple_SetItem(pArgs, i, pValue); 
     } 
     pValue = PyObject_CallObject(pFunc, pArgs); 
     Py_DECREF(pArgs); 
     if (pValue != NULL) { 
      printf("Result of call: %ld\n", PyLong_AsLong(pValue)); 
      Py_DECREF(pValue); 
     } 
     else { 
      Py_DECREF(pFunc); 
      Py_DECREF(pModule); 
      PyErr_Print(); 
      fprintf(stderr,"Call failed\n"); 
      return 1; 
     } 
    } 
    else { 
     if (PyErr_Occurred()) 
      PyErr_Print(); 
     fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); 
    } 
    Py_XDECREF(pFunc); 
    Py_DECREF(pModule); 
} 

明確這一行:

pValue = PyObject_CallObject(pFunc, pArgs); 

這是調用一個python函數(可調用python對象),pFunc,參數爲pArgs,並返回一個python對象pValue。

我建議閱讀整個頁面以更好地理解嵌入python。另外,既然你說你知道Python很少,我會建議你更熟悉這門語言,以及它與C/C++的區別。在嵌入它之前,您需要更多地瞭解python的工作原理。

編輯: 如果您需要將C/C++代碼和Python代碼之間共享內存(在單獨的線程中運行),我不相信你可以直接共享內存,至少不會在路上你會通常只使用c/C++。但是,您可以創建一個內存映射文件,以達到相同的性能。這樣做將取決於平臺,我沒有這方面的經驗,但這裏有一個鏈接,應該有所幫助:http://www.codeproject.com/Articles/11843/Embedding-Python-in-C-C-Part-II

基本上,您只需在c中創建mmap(這是平臺相關部分),然後在您的python代碼中爲同一個文件創建一個mmap,然後在每個線程中寫入/讀取文件描述符。

+0

我一直在有效地將Python嵌入到我的程序中,我知道如何獲得返回值。它不是問題。再次,這裏是我最初的問題: http://stackoverflow.com/questions/27940739/embedding-python-in-c-and-continuesly-pass-values-from-a-python-loop-to-the-c -pr 一次函數完成後,我只能返回一個值。我需要的是在Python函數運行時繼續更新值。 – user3030653

+0

啊,我明白了。我已經用更多的信息更新了我的答案。希望有幫助。 –