我将Python嵌入到C ++应用程序中(使用Python C API),我希望抛出的Python异常由已在C ++中设置的异常处理程序机制处理。这个异常处理程序机制将打印出异常本身,因此我不希望嵌入式Python解释器将其打印到屏幕上。我可以设置嵌入式Python解释器以某种方式抑制控制台输出吗?
答案 0 :(得分:4)
您可以将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
答案 1 :(得分:0)
你是如何执行代码的?如果没有直接通过python捕获并打印异常(某人已直接在python中安装了处理程序),则将其设置为异常处理,然后可以使用C检查异常(请参阅参考手册中的异常处理部分)。 / p>
如果从C代码调用python脚本,则调用函数将返回NULL或-1(发生异常),现在您可以使用上述API来读取异常(例如PyErr_Occurred(),.. 。)。
但是如果这些事情是由python代码本身完成的(如果有人在其代码中安装了一个钩子或其他东西并直接打印它),那么你就没有任何改变来轻松捕捉它。也许你可以自己添加一个钩子,调用你的代码。这可以通过sys.excepthook(类型,值,追溯)完成,一个解决方案是找到位置并将其从代码中删除或查看其他方法来规避它。
此网站提供了非常丰富的信息:Python API/include files
编辑: 对于重定向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也可能被其他东西取代,但到目前为止我还没有使用过它。