在Python中重定向c库stdout消息

时间:2015-02-05 10:22:09

标签: python-2.7 stdout gtk3 libvlc libav

我使用在Linux Mint 17.1上运行的Gtk + 3.10.8在Python 2.7中有一个GUI应用程序。

应用程序使用libvlc库的python绑定来嵌入视频播放器。 libvlc库使用libav进行视频处理。

我的问题是libav非常冗长并且会产生持续的警告流,而libvlc没有提供任何改变详细程度或抑制它的机制。

显然,可以通过运行python脚本来关闭噪音(例如):

$ ./myprogram.py &> /dev/null

我希望能够在程序中以编程方式实现相同的效果。我很高兴只是禁止从外部库到stdout的所有访问,但最终捕获该输出并实现一些日志记录会更好。

我可以在这个主题上找到的所有例子都假设更直接地控制外部过程,即将其声明为子过程。当我不能从我的Python代码直接访问有问题的实际库(libav)时,有没有其他方法可以做到这一点?

编辑: 感谢大家的帮助,可以在以下网址找到正确的答案: Python version of freopen(),回答#3。

您必须确保不从IDE以任何方式干扰stdout运行代码。交互式IDE倾向于这样做,并会抛出如下错误:

AttributeError: FileWrapper instance has no attribute 'fileno'

2 个答案:

答案 0 :(得分:0)

最简单的解决方案可能是关闭stdout并打开/dev/null作为新stdout。这应该有希望关闭用于stdout的底层文件描述符,这意味着下一个文件打开将重用该描述符。

答案 1 :(得分:0)

如果您可以从应用程序调用“C”库函数,则可以使用freopen()将标准输出和标准错误流从您的进程重定向到您自己的日志文件或我想到的/dev/null

我这样做的方式是:

FILE *stdout = fdopen(1, "w");
FILE *myout  = freopen("out.log", "w", stdout);

类似于stderr,使用2 1实例作为文件描述符参数:

FILE *stderr = fdopen(2, "w");
FILE *myerr  = freopen("err.log", "w", stdout);

我在LibVLC的Java绑定中完成了这个。