2015-11-15 344 views
0

我正在嘗試使用Python/C API來運行返回字符串的Python函數。我想將返回的字符串存儲到一個C++變量,但我無法讓它工作。我正在使用Python 3,而且似乎PyString_FromString()方法不再有效。這裏是我的代碼:Python 3:Python/C API字符串問題

int main(int argc, char *argv[]) 
{ 
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue; 

    Py_Initialize(); 

    pName = PyUnicode_FromString("ocr"); 

    pModule = PyImport_Import(pName); 

    pDict = PyModule_GetDict(pModule); 

    pFunc = PyDict_GetItemString(pDict, "get_text"); 

    pValue = PyUnicode_FromString("ocr_noise.png"); 
    pValue = PyObject_CallObject(pFunc, pValue); 

    std::string result = PyUnicode_FromObject(pValue); 

    Py_DECREF(pModule); 
    Py_DECREF(pName); 
    Py_DECREF(pValue); 

    Py_Finalize(); 

    return 0; 
} 

蟒蛇文件名爲ocr.py,我試圖調用函數被調用get_text(value)。我試圖通過"ocr_noise.png"作爲參數。任何想法我應該做什麼?

編輯2:我不需要在代碼中使用std :: string。我還可以使用什麼來存儲函數返回的字符串?

+1

你是什麼意思「看起來像'PyUnicode_FromString()'方法不再工作了?」?你是否遇到異常?段錯誤?還有別的嗎? –

+0

我的意思是PyString_FromString()。我的錯。 – MPorto

+0

在Python 3中沒有'PyString_FromString'這樣的東西。 –

回答

0

檢查所有Python函數的返回值是非常重要的。如果發生錯誤,Python將返回一個nullptr。所以PyUnicode_FromString()在你的代碼中正常工作。它只是段錯誤,因爲pValuenullptr你從PyObject_CallObject()得到。把PyErr_Print()只是這個調用打印後:

TypeError: argument list must be a tuple 

你需要傳遞的對象作爲參數,而不是一個單一的str的元組。相反,您可能需要使用PyObject_CallFunction(pFunc, "O", pValue)PyObject_CallFunction(pFunc, "s", "ocr_noise.png")

另外看看PyImport_ImportModule()。此外

std::string result = PyUnicode_FromObject(pValue); 

甚至不應該編譯,因爲它返回一個PyObject *不是string

+0

我應該怎麼做來存儲返回的字符串,然後? – MPorto

+0

[PyUnicode_FromObject()](https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_FromObject)可能根本沒用。 'pValue'應該是一個unicode對象。有關更多詳細信息,請參閱[將乾淨的方法轉換爲Python 3 Unicode到std :: string](https://stackoverflow.com/questions/17515467/clean-way-to-convert-pyvert-3-unicode-to-stdstring)如何從Python unicode對象獲取ac字符串。 – tynn