【问题标题】:Redirect c library stdout messages in Python在 Python 中重定向 c 库标准输出消息
【发布时间】:2015-02-05 10:22:09
【问题描述】:

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

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

我的问题是 libav 非常冗长并且会生成持续不断的警告流,而 libvlc 没有提供任何机制来更改或抑制它。

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

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

我希望能够在程序中以编程方式实现相同的效果。我很乐意简单地禁止从外部库对标准输出的所有访问,但最终最好捕获该输出并实现一些日志记录。

我能找到的关于这个主题的所有示例都假设对外部流程进行更直接的控制,例如将其声明为子流程。当我无法从我的 Python 代码直接访问有问题的实际库 (libav) 时,还有其他方法吗?

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

您只需要确保您没有从以任何方式干扰标准输出的 IDE 运行您的代码。交互式 IDE 倾向于这样做,并且会抛出如下错误:

AttributeError: FileWrapper instance has no attribute 'fileno'

【问题讨论】:

    标签: python-2.7 stdout gtk3 libvlc libav


    【解决方案1】:

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

    【讨论】:

    • 谢谢,虽然你没有解释具体怎么做(对不起,我有点初学者),这仍然是正确的答案。我的实际问题是我已经尝试了一个源代码示例,它确实做到了(没有意识到)但它没有运行,因为我是从一个抢占 stdout 的 IDE 运行的。我回到那个例子(以及其他一些例子),终于弄清楚发生了什么。例子是here,答案#3。
    【解决方案2】:

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

    我这样做的方法是:

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

    与 stderr 类似,使用 12 实例作为文件描述符参数:

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

    我在 LibVLC 的 Java 绑定中正是这样做的。

    【讨论】:

    • 谢谢,C 还是有点超出我的能力。但是,搜索有关 freopen() 的信息确实让我回到了我昨天看到的一个源示例,该示例编写了一个 Python 版本的 freopen(),下面@JoachimPileborg 的答案解释了该示例的作用。在发现我的 IDE 阻止代码运行后,我让 this example 开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多