如何将真正的字符串从python c-api转换为python脚本



我尝试使用将字符串从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 escape吗?还是我需要手动逃离?

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

这句话错了。Py_BuildValue中的'z'告诉它您传递的参数是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");

跳过自己创建CCD_ 11。

最新更新