抑制Python打印输出
Suppress Python printout
我正在将Python嵌入C++应用程序中(使用Python C API),我希望抛出的Python异常由C++中已经设置的异常处理程序机制处理。这个异常处理程序机制将打印出异常本身,所以我不希望嵌入式Python解释器将其打印到屏幕上。我可以设置嵌入式Python解释器以某种方式抑制控制台输出吗?
您可以将Stub Streamhandler插入python中的standard out
和standard error
通道。
这里是一个样本(包括撤销两个通道):
import sys
import cStringIO
print("Silencing stdout and stderr")
_stdout = sys.stdout
_stderr = sys.stderr
sys.stdout = cStringIO.StringIO()
sys.stderr = cStringIO.StringIO()
print("This should not be printed out")
sys.stdout = _stdout
sys.stderr = _stderr
print("Revoiced stdout and stderr")
运行此示例应得到以下输出:
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没有直接捕获和打印异常(有人直接在python中安装了处理程序),它将被设置为异常处理,然后可以使用C检查异常(请参阅参考手册中的异常处理一节)。
如果您从C代码调用python脚本,则调用函数将返回NULL或-1(发生异常),现在您可以使用上述API读取异常(例如PyErr_occured(),…)。
但是,如果这些事情是由python代码本身完成的(如果有人在其代码中安装了钩子或其他东西并直接打印它),那么您就无法轻松地捕获这些事情。也许你可以自己添加一个钩子,调用你的代码。这可以通过sys.excepthook(类型、值、回溯)来完成,一种解决方案是找到位置并将其从代码中删除,或者查看其他方法来绕过它
这个网站是非常有信息的关于它:Python API/包括文件
编辑:对于重定向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_FromFile可能也被其他东西取代了,我想,但到目前为止我还没有使用过。
- 数组类 阵列的打印输出
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 程序打印 % 后预期输出
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 为什么打印 c 样式字符串的'address of index n'会导致子字符串的输出
- 为什么打印"OK"会改变输出?
- 打印输出在主,而不是在函数中
- 该程序没有产生输出,而是卡在一个循环中,几秒钟后消失并打印被杀死?
- 存储和打印字符,但输出不是预期的
- 执行ls命令并打印输出
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 将C++输出打印到文本文件
- 如何仅使输出打印一次
- 以未格式化的输出 c++ 打印输出
- 如何将谷歌测试输出打印到文本文件
- 为类打印输出(打印调试信息)的最佳实践是什么?
- 将命令行输出打印到Linux(Ubuntu)的文本文件中
- 输出打印地址而不是3D数组指针中的值
- 将Qt C++输出打印到QML中写入的应用程序屏幕
- 多线程文本输出打印到dos控制台重叠/混乱输出