如何在 Python 中打印到 stderr 和 stdout

如何在 Python 中打印到 stderr 和 stdout

How to print to stderr and stdout in Python

默认情况下,print()函数打印到stdout. 要打印到stderr请在函数调用中将file关键字参数设置为
,例如
sys.stderrprint()print("an error occurred", file=sys.stderr)

主程序
import sys # 👇️ prints to stderr print("an error occurred", file=sys.stderr) # 👇️ prints to stdout print('example')

print函数获取一个或多个对象并将它们打印到sys.stdout.

stdout用于print()函数的输出和input().

stderr用于解释器的提示和错误信息。

默认情况下,file关键字参数设置为 的当前值
sys.stdout

如果运行代码片段,您将看到两条消息都打印到您的终端。这是默认行为。

标准错误和标准输出

单独使用stdoutstderr很有用,因为其中一个可以重定向到文件、缓冲区,或者/dev/null另一个可以保持指向终端。

主程序
from io import StringIO import sys buffer = StringIO() # 👇️ redirect sys.stdout (messages won't be shown to terminal) sys.stdout = buffer print('⛔️ This is NOT shown') print('✅ This is shown', file=sys.stderr)

重定向 stdout 保留 stderr

该函数的file关键字参数print()默认为sys.stdout.

我们重定向sys.stdout到内存缓冲区,因此在未指定关键字参数print()时未连接到终端。file

但是,sys.stderr仍然指向终端,所以显示第二print()类的消息。

您可能通常需要做的事情是将print()
函数的输出重定向到一个变量,同时仍然能够用于
sys.stderr打印到终端。

主程序
from io import StringIO import sys # 👇️ redirect sys.stdout to buffer buffer = StringIO() sys.stdout = buffer # 👇️ store output of print() in a variable print('Store this in the variable below ✅') print_output = buffer.getvalue() print('Can still use stderr', file=sys.stderr) # 👉️ Can still use stderr # 👇️ restore stdout to default for print (optional) sys.stdout = sys.__stdout__ # 👇️ -> Store this in the variable below ✅ print('->', print_output)

将打印输出存储在变量中

io.StringIO类返回一个内存缓冲区

我们重定向sys.stdout到缓冲区并使用该print()函数打印一个值。

可以使用
getvalue()
方法访问该值。

该方法返回一个bytes包含缓冲区全部内容的对象。

将值存储到变量中后,可以将sys.stdout
属性恢复为默认值,这样就可以使用
print()函数了。

即使sys.stdout被重定向,我们仍然可以使用关键字参数设置为的函数来打印到终端。 print()filesys.stderr

另一种可能更简洁的方法是使用logging模块登录到sys.stderr.

主程序
import logging FORMAT = '%(message)s' logging.basicConfig(format=FORMAT) # 👇️ __name__ is module's name logger = logging.getLogger(__name__) logger.warning('prints to stderr') print('prints to stdout')

记录 stderr 和 stdout

我们使用
logging.basicConfig
方法来初始化记录器的基本配置。

%(message)s格式仅包含日志记录调用中的消息。

logging.getLogger
方法返回具有指定名称的记录器

__name__全局变量存储模块的名称

logger.warning()方法sys.stderr默认
打印到
print()函数sys.stdout默认打印到。

这是因为默认情况下,方法的stream关键字参数basicConfig
设置为
sys.stderr,而file函数中的参数print()
设置为
sys.stdout

主程序
import sys import logging FORMAT = '%(message)s' # 👇️ specified default value for stream logging.basicConfig(stream=sys.stderr, format=FORMAT) # 👇️ __name__ is module's name logger = logging.getLogger(__name__) logger.warning('prints to stderr') # 👇️ specified default value for file print('prints to stdout', file=sys.stdout)

发表评论