如何在 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'')
我的问题与该论坛上的许多其他问题类似,但 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'')