我将 Python 嵌入到 C++ 应用程序中(使用 Python C API),并且我希望抛出的 Python 异常由已经在 C++ 中设置的异常处理程序机制处理。这种异常处理机制将打印出异常本身,因此我不希望嵌入式 Python 解释器将其打印到屏幕上。我可以设置嵌入式 Python 解释器以某种方式抑制控制台输出吗?
2 回答
您可以将 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_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 也可能被其他东西取代,但到目前为止我还没有使用过这个。