2017-09-19 30 views
0

完全嵌入PythonC++的小問題。現在的問題是,我有一個Python代碼,會返回一個元組,又名在這種情況下的說法是:如何將Python 3.6中的元組傳遞給C++

pValue = PyObject_CallObject(pFunc, pArgs); 
Py_DECREF(pArgs); 
if (pValue != NULL) 
{ 
    printf("Result of call: %d\n", PyTuple_GetItem(pArgs, i, pValue)); 
} 

def test(): 
    x = 1; 
    y=2; 
    c=3; 
    d=4; 
    return [x,y,c,d] 

C++,我在下面的方式嵌入代碼出於某種原因,打印輸出是這樣的:

調用的結果:1846660304

嘗試也重新轉動一根繩子,這也不起作用。只有一個工作人員返回例如返回h和C++而不是使用PyTuple_GetItem,使用PyLong_AsLong()

可有人請點我在如何閱讀他返回值C++正確的方向,我是相當新的Python,不幸的是Python文檔是不好的水平上至少在這種情況下,沒有代碼示例或任何事情。

+2

這是一個_list_,而不是一個元組。我猜'PyTuple_GetItem'返回一個變量的內存地址,而不是它的實際值。 – ForceBru

+0

好的,但如何真正對待在C++又如何提取數據?或換句話說,將多個參數從python腳本傳遞給C++以及如何提取數據的最佳方法是什麼? – aalamaki

+0

https://docs.python.org/3/c-api/tuple.html – ForceBru

回答

0

元組被(1,2,3,4)包圍,而不是括號。嘗試更改Py代碼中的元組,然後重新運行代碼。

2

你有四個方面的問題:

  • 你的函數返回一個list,而不是一個tuple。使用PyTuple_GetItem是不合適的;和
  • PyTuple_GetItem不需要三個參數,它只需要兩個;和
  • 因爲無論如何您都無法確定返回類型,您最好使用PyObject_GetItem;和
  • 最重要的是,你正在看錯對象

也就是說,您正在使用PyTuple_GetItem(pArgs, i, pValue),它將嘗試查看pArgs。你大概想要訪問什麼pValue

PyObject_GetItem(pValue, i) 
+0

嗨,我試着按照你的建議,結果是整個可執行文件崩潰了:Just-In-Time調試器在printf處說明未被捕獲的異常。我也嘗試過使用PyObject_GetItem(pValue,0),但是結果相同... – aalamaki

+0

另外,'PyObject_GetItem'會給你另一個'PyObject *'(代表一個整數),它不能像C整數那樣傳遞給'printf'。 – Jeronimo

+0

嗯好吧,我明白了;如何正確地將它傳遞給printf?底線是我只需要從Python獲得返回值到C++中的變量,我不知道該怎麼做。帶有零代碼示例的Python文檔沒有多大用處。 – aalamaki