如何在 jupyter 中抑制来自 sys 和 os 的消息?

How to suppress messages from sys and os in jupyter?

我的问题与该论坛上的许多其他问题类似,但 none 的解决方案似乎有效。我有一个调用打印一些东西的命令行函数的函数。我不希望这些东西印在我的笔记本上。但是,为了重现让我们使用函数:

import os

def p():
    os.system('echo some_stuff')

如果此功能在 jupyter 单元中执行,则 %%capture 或任何其他建议的解决方案都不会抑制它。

其次,&> /dev/null 不适合我的目的。

使用 os.system 不会让您控制进程的任何内容,因此它将继承 stdout 句柄并直接打印到它,而您的 Python 进程无法执行任何操作关于它。

您应该使用 subprocess,它可以让您更多地控制子进程的创建,并在必要时能够查看其输出等。在这种情况下,您可以将标准流重定向到 devnull,或者如果您需要使用 subprocess.PIPE.

与之交互

作为一个额外的好处,默认情况下,子进程不会在 shell 中 运行(尽管它可以指定 shell=True),这会更快一点,并且可能更安全。

例如,这里第一个进程打印到标准输出,因为它没有重定向到任何地方,第二个进程的输出被抑制,第三个进程的输出被捕获并通过返回的 CompletedProcess 上的 stdout 属性访问对象。

In [90]: subprocess.run(["python", "-c", "print('printed')"])
printed
Out[90]: CompletedProcess(args=['python', '-c', "print('printed')"], returncode=0)

In [91]: subprocess.run(
    ...:     ["python", "-c", "print('printed')"],
    ...:     stdout=subprocess.DEVNULL,
    ...:     stderr=subprocess.DEVNULL,
    ...: )
Out[91]: CompletedProcess(args=['python', '-c', "print('printed')"], returncode=0)

In [92]: subprocess.run(
    ...:     ["python", "-c", "print('printed')"],
    ...:     stdout=subprocess.PIPE,
    ...:     stderr=subprocess.PIPE,
    ...: )
Out[92]: CompletedProcess(args=['python', '-c', "print('printed')"], returncode=0, stdout=b'printed\r\n', stderr=b'')