Я пытаюсь отправить строку из 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
? Нужен ли собственный выход на Python? Или мне нужно сбежать вручную?
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
самостоятельно.