首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >禁止显示Python打印输出

禁止显示Python打印输出
EN

Stack Overflow用户
提问于 2012-09-05 22:12:53
回答 2查看 729关注 0票数 1

我正在将Python嵌入到一个C++应用程序中(使用Python C API),我希望抛出的Python异常由C++中已经设置的异常处理机制来处理。此异常处理机制将打印出异常本身,因此我不希望嵌入式Python解释器将其打印到屏幕上。我可以设置嵌入式Python解释器以某种方式抑制控制台输出吗?

EN

回答 2

Stack Overflow用户

发布于 2012-09-05 23:14:55

在python中,您可以将Stub-Stub处理程序插入到standard outstandard error通道中。

这里是一个示例(包含两个通道的恢复):

代码语言:javascript
运行
复制
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")

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

代码语言:javascript
运行
复制
Silencing stdout and stderr
Revoiced stdout and stderr

已更新

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

代码语言:javascript
运行
复制
import os, sys
with open(os.devnull, 'w') as devnull:
    sys.stdout = devnull
    sys.stderr = devnull
    # ... here your code
票数 4
EN

Stack Overflow用户

发布于 2012-09-05 22:56:06

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

如果您从C代码调用python脚本,调用函数将返回NULL或-1 (已发生异常),现在您可以使用上述接口读取异常(例如PyErr_Occurred(),... )。

但是,如果事情是由python代码本身完成的(如果有人在其代码中安装了钩子或其他东西并直接打印它),您就没有什么变化来轻松地捕获它们。也许你可以自己添加一个钩子,调用你的代码。这可以通过sys.excepthook(类型、值、回溯)来完成,一种解决方案是找到位置并将其从代码中删除,或者查看其他方法来绕过它。

这个网站提供了非常丰富的信息:Python API/include files

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

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12283465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档