抑制Python打印输出 我将Python嵌入到C++应用程序中(使用Python C API),我希望Python异常被异常处理机制处理,而该异常处理机制已经在C++中安装。这个异常处理机制将打印出异常本身,所以我不希望嵌入式Python解释器将其打印到屏幕上。我可以设置嵌入式Python解释器以某种方式抑制控制台输出吗?

抑制Python打印输出 我将Python嵌入到C++应用程序中(使用Python C API),我希望Python异常被异常处理机制处理,而该异常处理机制已经在C++中安装。这个异常处理机制将打印出异常本身,所以我不希望嵌入式Python解释器将其打印到屏幕上。我可以设置嵌入式Python解释器以某种方式抑制控制台输出吗?,c++,python,C++,Python,您是如何执行代码的?如果python没有直接捕获和打印异常(有人直接在python中安装了处理程序),则将其设置为异常处理,然后可以使用C检查异常(请参阅参考手册中的异常处理一节) 如果从C代码调用python脚本,调用函数将返回NULL或-1(发生异常),现在可以使用上述API读取异常(例如PyErr_occurrent(),…) 但是,如果这些事情是由python代码本身完成的(如果有人在其代码中安装了钩子或其他东西并直接打印出来),那么您就不需要进行任何更改来轻松捕获这些事情。也许你可以自

您是如何执行代码的?如果python没有直接捕获和打印异常(有人直接在python中安装了处理程序),则将其设置为异常处理,然后可以使用C检查异常(请参阅参考手册中的异常处理一节)

如果从C代码调用python脚本,调用函数将返回NULL或-1(发生异常),现在可以使用上述API读取异常(例如PyErr_occurrent(),…)

但是,如果这些事情是由python代码本身完成的(如果有人在其代码中安装了钩子或其他东西并直接打印出来),那么您就不需要进行任何更改来轻松捕获这些事情。也许你可以自己添加一个钩子,调用你的代码。这可以通过sys.excepthook(type、value、traceback)实现,一种解决方案是找到位置并将其从代码中删除,或者查看其他方法来绕过它

本网站提供了大量信息:

编辑: 要重定向stdout或stderr,可以使用C-Api函数:

FILE* sto = fopen("out.txt", "w+");
FILE* ste = fopen("outErr.txt", "w+");
PySys_SetObject("stdout", PyFile_FromFile(sto, "out.txt","wb", fclose)); 
PySys_SetObject("stderr", PyFile_FromFile(ste, "outErr.txt","wb", fclose)); 

在调用任何其他python代码之前。我想,PyFile\u FromFile可能也会被其他东西取代,但到目前为止我还没有使用它。

您是如何执行代码的?如果python没有直接捕获和打印异常(有人直接在python中安装了处理程序),则将其设置为异常处理,然后可以使用C检查异常(请参阅参考手册中的异常处理一节)

如果从C代码调用python脚本,调用函数将返回NULL或-1(发生异常),现在可以使用上述API读取异常(例如PyErr_occurrent(),…)

但是,如果这些事情是由python代码本身完成的(如果有人在其代码中安装了钩子或其他东西并直接打印出来),那么您就不需要进行任何更改来轻松捕获这些事情。也许你可以自己添加一个钩子,调用你的代码。这可以通过sys.excepthook(type、value、traceback)实现,一种解决方案是找到位置并将其从代码中删除,或者查看其他方法来绕过它

本网站提供了大量信息:

编辑: 要重定向stdout或stderr,可以使用C-Api函数:

FILE* sto = fopen("out.txt", "w+");
FILE* ste = fopen("outErr.txt", "w+");
PySys_SetObject("stdout", PyFile_FromFile(sto, "out.txt","wb", fclose)); 
PySys_SetObject("stderr", PyFile_FromFile(ste, "outErr.txt","wb", fclose)); 

在调用任何其他python代码之前。我想,PyFile\u FromFile可能也会被其他东西取代,但我到目前为止还没有使用它。

您可以将存根Streamhandler插入python中的
标准输出
标准错误
通道

这里是一个示例(包括重新打开两个通道):

运行此示例将产生以下输出:

Silencing stdout and stderr
Revoiced stdout and stderr
[更新]

这里是发送到
devnull
的节省内存变量:

import os, sys
with open(os.devnull, 'w') as devnull:
    sys.stdout = devnull
    sys.stderr = devnull
    # ... here your code

您可以将存根Streamhandler插入python中的
标准输出
标准错误
通道

这里是一个示例(包括重新打开两个通道):

运行此示例将产生以下输出:

Silencing stdout and stderr
Revoiced stdout and stderr
[更新]

这里是发送到
devnull
的节省内存变量:

import os, sys
with open(os.devnull, 'w') as devnull:
    sys.stdout = devnull
    sys.stderr = devnull
    # ... here your code

哪个代码正在写入控制台?Python代码还是C++代码?C++代码。我不希望Python代码写入控制台。谢谢。哪个代码正在编写控制台?Python代码还是C++代码?C++代码。我不希望Python代码写入控制台。谢谢。将输出重定向到这样的内存缓冲区会不必要地消耗内存。最好将其发送到Windows上的
/dev/null
(或
NUL
)是的,你说得对。如果不需要缓冲区的内容,最好将两者重定向到
os.devnull
。我已经用这个示例更新了我的Answare。就像您的更新一样。;-)也可能使它成为一个上下文管理器,就像我在这里展示的那样。提问者在C++中使用了一个方法,而不是在Python控制台上实现(参见最后第二个问题的评论)。一般的方法是他想要做的,但是这里缺少CApi实现。将输出重定向到这样的内存缓冲区会不必要地消耗内存。最好将其发送到Windows上的
/dev/null
(或
NUL
)是的,你说得对。如果不需要缓冲区的内容,最好将两者重定向到
os.devnull
。我已经用这个示例更新了我的Answare。就像您的更新一样。;-)也可能使它成为一个上下文管理器,就像我在这里展示的那样。提问者在C++中使用了一个方法,而不是在Python控制台上实现(参见最后第二个问题的评论)。一般的方法是他想要做的,但是这里缺少CApi实现。