Как получить реальную строку из Python C-API в Python-скрипт? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь отправить строку из c ++ в строку python, используя:

PyObject* pyString = PyUnicode_FromString("/abc/def.html/a%22.php?abc=&def=%22;%00s%01");
....
PyObject* pyArgs = Py_BuildValue("(z)", pyString);
...
PyObject_CallObject(pFunc, pyArgs);

Но в скрипте строка плохая:

function(data):
    print(data)

Результат:

/abc/def.html/a              bogus %pp?abc=&def=                    %;(null)%

Что случилось ?, Если я пытаюсь экранировать % символов с %%, то работает нормально, но PyUnicode_FromString не является форматом printf.

Это ошибка функции PyUnicode_FromString?, Мне нужен родной побег питона?Или мне нужно вручную убежать?

1 Ответ

0 голосов
/ 26 октября 2018
PyObject* pyArgs = Py_BuildValue("(z)", pyString);

Эта строка неверна.'z' в Py_BuildValue говорит о том, что передаваемый аргумент является const char*, и Python должен преобразовать его в строку Python.Однако передаваемый аргумент уже является строкой Python.Поэтому он пытается интерпретировать PyObject* как const char* и генерирует мусор.

Правильное решение -

PyObject* pyArgs = Py_BuildValue("(O)", pyString);

, которое просто интерпретирует pyString как объект Python (которыйэто так!) или

PyObject* pyArgs = Py_BuildValue("(z)", "/abc/def.html/a%22.php?abc=&def=%22;%00s%01");

, чтобы пропустить создание pyString самостоятельно.

...