如何在 Python 中打印到 stderr 和 stdout
How to print to stderr and stdout in Python
默认情况下,print()
函数打印到stdout
. 要打印到stderr
,请在函数调用中将file
关键字参数设置为
,例如。sys.stderr
print()
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
。
如果运行代码片段,您将看到两条消息都打印到您的终端。这是默认行为。
单独使用stdout
和stderr
很有用,因为其中一个可以重定向到文件、缓冲区,或者/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)
该函数的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()
file
sys.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')
我们使用
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)