2015-11-15 2 views
0

Я пытаюсь использовать API Python/C для запуска функции Python, которая возвращает строку. Я хочу сохранить эту возвращенную строку в переменную C++, но я не могу заставить ее работать. Я использую Python 3, и кажется, что метод PyString_FromString() больше не работает. Вот мой код:Python 3: Проблемы с строкой API Python/C

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" в качестве аргумента. Любые идеи, что я должен делать?

EDIT 2: Мне не нужно использовать std :: string, как в коде. Что еще я могу использовать для хранения строки, возвращаемой функцией?

+1

Что вы имеете в виду «похоже, что метод PyUnicode_FromString() больше не работает»? Вы получаете исключение? Segfault? Что-то другое? –

+0

Я имел в виду PyString_FromString(). Виноват. – MPorto

+0

В Python нет такой вещи, как 'PyString_FromString'. –

ответ

0

Необходимо проверить возвращаемые значения всех функций Python. Python возвращает nullptr, если произошла ошибка. Итак, PyUnicode_FromString() отлично работает в вашем коде. Это просто segfaults, потому что pValue - это nullptr, который вы получили от 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-python-3-unicode-to-stdstring) для более подробной информации о как получить строку ac из объекта юникода Python. – tynn