1

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

4

2 回答 2

4

您可以将 Stub-Streamhandler 插入 python 中的standard outstandard 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
于 2012-09-05T15:14:55.263 回答
0

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

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

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

这个网站提供了很多关于它的信息:Python API/include files

编辑:对于重定向标准输出或标准错误,您可以使用 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 也可能被其他东西取代,但到目前为止我还没有使用过这个。

于 2012-09-05T14:56:06.430 回答