在Python中导入库时如何抑制输出

6
我有一个需要在我的代码中导入的库。然而,每当它被导入时,它会在控制台输出几行数据。我该如何抑制输出?
谢谢

你能修复这个库吗? - Stefan Pochmann
我宁愿不去碰这个库,因为我只需要在一个特定的脚本中抑制输出,而且该库被“My”服务器上的多个用户使用。输出仅仅是一些带有版权信息的几行文本,所以并不会打扰任何人。在这种特殊情况下,由于我正在结合Bash和Python,我需要让输出消失。 - jorgehumberto
1
嘿嘿,这里没有任何非法行为,作者与我合作并且不介意。但这是学术界,所以总是要给应得的人以荣誉。但在这种特殊情况下,我需要一个“干净”的输出来传递给bash(避免使用临时文件...)。 - jorgehumberto
3个回答

10
import os
import sys

# silence command-line output temporarily
sys.stdout, sys.stderr = os.devnull, os.devnull

# import the desired library
import library

# unsilence command-line output
sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__

3
非常微小的一点,但我建议使用 sys.stdout = sys.stderr = os.devnull。该代码可以将标准输出和标准错误流重定向到 /dev/null,以消除不必要的输出。 - Ben
不太确定为什么,但是 @Ben 的建议在 vscode/jupyter notebook 中导致了无限执行,而原帖没有。import sys import os print("hello world") sys.stdout = sys.stderr = os.devnull print("hello world") - Björn
不太确定为什么,但是@Ben的建议在vscode/jupyter notebook中导致了无限执行,而原帖没有。import sys import os print("hello world") sys.stdout = sys.stderr = os.devnull print("hello world") - undefined

6
您可以尝试将 sys.stdout 重定向到一个 StringIO 中,以捕获任何文本输出。 所以基本上所有会被打印出来的东西都将保存在 text_trap 中。
import io
import sys

#setup text trap
text_trap = io.StringIO()
sys.stdout = text_trap

#to reset the text trap
sys.stdout = sys.__stdout__

一个可用的示例:
from io import BytesIO as StringIO
import sys

if __name__ == "__main__":
    print "hello1"

    #setup text trap
    text_trap = StringIO()
    sys.stdout = text_trap

    print("hello2")

    #reset
    sys.stdout = sys.__stdout__
    print "hello3"

输出:

hello1
hello3

不错,对于这个特定的脚本,我更喜欢上述方法,但将来我会注意到这一点。谢谢! - jorgehumberto

2
我发现这个答案这个代码片段非常有帮助。
例如,你可以编写一个小的自定义上下文管理器来临时抑制包的导入消息。 如何抑制导入消息:
with suppress_stdout_stderr():
    import library_with_import_message

上下文管理器:

# Via Stack Overflow
# https://dev59.com/_2gu5IYBdhLWcg3wt5Lt
# Via gist https://gist.github.com/vikjam/755930297430091d8d8df70ac89ea9e2
import os
from contextlib import contextmanager, redirect_stderr, redirect_stdout

@contextmanager
def suppress_stdout_stderr():
    """A context manager that redirects stdout and stderr to devnull"""
    with open(os.devnull, 'w') as fnull:
        with redirect_stderr(fnull) as err, redirect_stdout(fnull) as out:
            yield (err, out)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接