Py_BuildValue返回异常:C++扩展返回内存地址而非预期字符串
Python扩展调用返回乱码问题排查
你遇到的问题根源很明确:直接把C++的std::string对象传给Py_BuildValue("s", ...)是错误的。
问题原因
Py_BuildValue的s格式符要求传入的是C风格的const char*指针,指向以\0结尾的字符数组。但你直接传了std::string对象——这是一个C++类,它的内存布局里包含指针、长度等成员,编译器会把这个对象的内存内容当成字符序列来解析,自然就输出了类似内存地址的乱码内容,而不是你期望的大写字符串。
修复方案
只需要把std::string转换成C风格字符串再传入,调用std::string的c_str()方法就能拿到符合要求的const char*指针:
using namespace boost::algorithm; static PyObject* strtest(PyObject* self, PyObject* args) { std::string s = "Boost C++ Libraries"; to_upper(s); // 调用c_str()获取C风格字符串指针 PyObject * python_val = Py_BuildValue("s", s.c_str()); return python_val; }
额外说明
不用担心字符串生命周期的问题:Py_BuildValue在处理s格式时,会拷贝传入的C字符串内容到新创建的Python字符串对象里,所以即使原std::string在函数结束后被销毁,Python字符串依然能正常使用。
内容的提问来源于stack exchange,提问作者user2723494
相关产品推荐
相关产品推荐

