Python 3.x 如何在C++;密码 一个关于如何在C++代码中捕获python STDUT,它是有效的-但是仅在Python 2中。

Python 3.x 如何在C++;密码 一个关于如何在C++代码中捕获python STDUT,它是有效的-但是仅在Python 2中。,python-3.x,python-c-api,Python 3.x,Python C Api,我想在Python3中使用类似的东西。有人能帮我吗 更新 下面是我正在使用的代码。它是从上面引用的Mark answer移植而来的,唯一的变化是使用了PyBytes\u AsString而不是PyString\u AsString,如图所示 #包括 #包括 int main(int argc,字符**argv) { std::字符串stdouter= “导入系统\n\ 类CatchOutErr:\n\ 定义初始化(自我):\n\ self.value=''\n\ def写入(自身,txt):\n

我想在Python3中使用类似的东西。有人能帮我吗

更新

下面是我正在使用的代码。它是从上面引用的Mark answer移植而来的,唯一的变化是使用了
PyBytes\u AsString
而不是
PyString\u AsString
,如图所示

#包括
#包括
int main(int argc,字符**argv)
{
std::字符串stdouter=
“导入系统\n\
类CatchOutErr:\n\
定义初始化(自我):\n\
self.value=''\n\
def写入(自身,txt):\n\
self.value+=txt\n\
catchOutErr=catchOutErr()\n\
sys.stdout=catchOutErr\n\
sys.stderr=catchOutErr\n\
“;//这是重定向stdouts/stderr的python代码
Py_初始化();
PyObject*pModule=PyImport\u AddModule(“\u main\u”);//创建主模块
PyRun_SimpleString(stdOutErr.c_str());//调用代码重定向
PyRun_SimpleString(“打印(1+1)”;//这是正常的标准输出
PyRun_SimpleString(“1+a”);//这会创建一个错误
PyObject*catcher=PyObject_GetAttrString(pModule,“catchOutErr”);//获取上面创建的catchOutErr
PyErr_Print();//使python打印任何错误
PyObject*output=PyObject\u GetAttrString(catcher,“value”);//从catchOutErr对象获取stdout和stderr
PrimTf(“这里是输出:\n%s”,PyByTySasASScript(输出));/ /它不是在我们的C++部分
Py_Finalize();
返回0;
}
我使用Python 3库构建它:

g++-I/usr/include/python3.6m-Wall-Werror-fpic code.cpp-lpython3.6m

输出为:

以下是输出:
(空)


如果有人需要关于这个问题的更多信息,请告诉我,我会在这里提供。

您的问题是
。value
不是
字节
对象,而是
字符串
(即Python2
unicode
)对象。因此,
PyBytes\u AsString
失败。我们可以使用
PyUnicode\u asencodestring
将其转换为
bytes
对象

PyObject *output = PyObject_GetAttrString(catcher,"value"); //get the stdout and stderr from our catchOutErr
PyObject* encoded = PyUnicode_AsEncodedString(output,"utf-8","strict");
printf("Here's the output:\n %s", PyBytes_AsString(encoded));

请注意,您应该对照NULL检查这些结果
PyObject*
,以查看是否发生了错误。

以何种方式不起作用?纯Python版本a可以与Python 3配合使用,所以我不明白为什么C-API版本不能?我将编辑问题并输入我正在使用的代码。缩进在
stdOutErr
中看起来是错误的。这是我的第一个猜测谢谢DavidW,你的建议解决了上面代码的问题。我对此还有其他疑问,在我正在处理的代码中,
PyUnicode\u AsEncodedString
总是返回
NULL
。其他函数正在工作(或者至少它们没有返回
NULL
)。你知道它可能是什么吗?这意味着它引发了一个例外。你应该检查一下,看看出了什么问题。这有点难,因为你重定向了stderr。除了“严格”之外的争论可能会使它起作用。
PyObject *output = PyObject_GetAttrString(catcher,"value"); //get the stdout and stderr from our catchOutErr
PyObject* encoded = PyUnicode_AsEncodedString(output,"utf-8","strict");
printf("Here's the output:\n %s", PyBytes_AsString(encoded));