Как преобразовать PyObjects в типы данных C? - PullRequest
0 голосов
/ 26 октября 2019

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

    Py_Initialize();
//the expected output, the player's output, and the compare functions
//PyObject* expectAnswer; //the expected answer for the level
PyObject* main = PyImport_AddModule("_main_");
PyObject* globalDictionary = PyModule_GetDict(main);
PyObject* localDictionary = PyDict_New();
PyObject* result = PyRun_String(cPlayerString, Py_file_input, globalDictionary, localDictionary);



Py_Finalize();

Мне интересно, просто я не использую правильный вызов. const char* PyUnicode_AsData() выглядит многообещающе, но я до сих пор не представляю, нужно ли мне сначала конвертировать то, что у меня есть, в Unicode.

Спасибо за помощь!

1 Ответ

1 голос
/ 28 октября 2019
  1. Вам не хватает всей проверки ошибок. Практически каждый вызов Python C API имеет возвращаемое значение, которое указывает, произошла ли ошибка, обычно указатель NULL. Вы должны проверить это и обработать ошибку, если она произошла. Я, мягко говоря, предположу, что вы опускаете это ради краткого вопроса.

  2. __main__;двойное подчеркивание.

  3. Вероятно, ваша настоящая проблема: прочитайте документацию по стартовым токенам . Py_file_input оценивает строку, как если бы это был файл Python (т. Е. Произвольно длинный набор операторов). Файл Python ничего не «возвращает», поэтому result, вероятно, является None объектом - вы всегда можете проверить его, чтобы подтвердить это. Возможны следующие варианты:

    • для использования токена Py_eval_input, который обрабатывает только одно выражение и возвращает результат.

    • использует фактчто набор операторов (Py_file_input) изменит локальный словарь - любые переменные, назначенные для них, будут доступны в словаре впоследствии, и вы сможете получить к ним доступ.

  4. Объект, который вы в конечном итоге получите (вероятно), не будет строкой, поэтому вызов строковых функций для него может привести к сбою (Py*_Check функций используются для подтверждения типа и предотвращения такого рода сбоев). Возможно, вы захотите использовать универсальные функции PyObject в первом случае. PyObject_Print/Str/Repr может быть то, что вы ищете.

...