Что я использую вместо PyString_AsString при загрузке модуля Python в 3.3

Я пытаюсь загрузить функцию из Python в одной из моих программ на C ++, используя эту функцию

char * pyFunction(void)
{
char *my_result = 0;
PyObject *module = 0;
PyObject *result = 0;
PyObject *module_dict = 0;
PyObject *func = 0;
PyObject *pArgs = 0;

module = PyImport_ImportModule("testPython");
if (module == 0)
{
PyErr_Print();
printf("Couldn't find python module");
}
module_dict = PyModule_GetDict(module);
func = PyDict_GetItemString(module_dict, "helloWorld");

result = PyEval_CallObject(func, NULL);
//my_result = PyString_AsString(result);
my_result = strdup(my_result);
return my_result;
}

Что я должен использовать вместо PyString_AsString?

6

Решение

В зависимости от типа возвращаемого из вашего helloWorld() функция, это
может варьироваться, так что лучше проверить это.

Для обработки возвращенного str (Python 2 unicode), тогда вам нужно будет
закодировать это. Кодировка будет зависеть от вашего варианта использования, но я собираюсь
используйте UTF-8:

if (PyUnicode_Check(result)) {
PyObject * temp_bytes = PyUnicode_AsEncodedString(result, "UTF-8", "strict"); // Owned reference
if (temp_bytes != NULL) {
my_result = PyBytes_AS_STRING(temp_bytes); // Borrowed pointer
my_result = strdup(my_result);
Py_DECREF(temp_bytes);
} else {
// TODO: Handle encoding error.
}
}

Для обработки возвращенного bytes (Python 2 str), то вы можете получить
строка напрямую:

if (PyBytes_Check(result)) {
my_result = PyBytes_AS_STRING(result); // Borrowed pointer
my_result = strdup(my_result);
}

Кроме того, если вы получаете не строковый объект, вы можете преобразовать его
с помощью PyObject_Repr (), PyObject_ASCII (), PyObject_Str (), или же PyObject_Bytes ().

Итак, в конце концов, вы, вероятно, хотите что-то вроде:

if (PyUnicode_Check(result)) {
// Convert string to bytes.
// strdup() bytes into my_result.
} else if (PyBytes_Check(result)) {
// strdup() bytes into my_result.
} else {
// Convert into your favorite string representation.
// Convert string to bytes if it is not already.
// strdup() bytes into my_result.
}
11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]