Python中如何打印到标准错误输出(stderr)

Python中如何打印到标准错误输出(stderr)

技术背景

在Python编程中,标准错误输出(stderr)常用于输出错误信息和调试信息,以便将其与正常的标准输出(stdout)区分开来。不同版本的Python提供了多种方法来实现将信息打印到stderr。

实现步骤

Python 2

  • 使用 print >> sys.stderr
1
2
import sys
print >> sys.stderr, 'spam'

这种方法简单直接,可以直接打印列表、字典等对象,无需先将其转换为字符串。

Python 3

  • 使用 print() 函数并指定 file=sys.stderr
1
2
import sys
print("fatal error", file=sys.stderr)

或者使用从 sys 模块导入的 stderr

1
2
from sys import stderr
print("Hello, world!", file=stderr)

封装函数

为了方便重复使用,可以封装一个自定义的打印到stderr的函数:

1
2
3
4
import sys

def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)

使用方式与标准的 print 函数相同:

1
2
eprint("Test")
eprint("foo", "bar", "baz", sep="---")

使用 logging 模块

logging 模块专门用于记录日志,默认情况下可以将错误信息输出到stderr:

1
2
3
4
5
import logging

logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')

核心代码

以下是一个完整的示例,展示了不同方法的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
import logging

# 自定义打印到stderr的函数
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)

# 使用自定义函数
eprint("Custom function test")

# 使用print函数指定file参数
print("Using print with file=sys.stderr", file=sys.stderr)

# 使用logging模块
logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('Logging to stderr')

# Python 2兼容示例(如果在Python 2环境中运行)
try:
print >> sys.stderr, 'Python 2 style'
except SyntaxError:
pass

最佳实践

  • 选择合适的方法:根据Python版本和具体需求选择合适的打印到stderr的方法。如果需要支持Python 2和Python 3,建议使用封装函数的方式。
  • 使用 logging 模块:对于复杂的应用程序,使用 logging 模块可以更好地管理日志信息,包括日志级别、日志格式等。
  • 性能考虑:如果对性能有较高要求,sys.stderr.write() 方法通常比 print 函数更快,但需要手动处理换行符等问题。

常见问题

在Python 3中,print >> sys.stderr 语法已被移除,需要使用 print() 函数并指定 file=sys.stderr

sys.stderr.write()print 函数的区别

sys.stderr.write() 是一个底层的写入方法,需要手动处理换行符和字符串转换;而 print 函数是一个高级的打印方法,会自动处理这些问题,但性能相对较低。

重定向 stderr 后部分方法可能失效

使用 partial 封装的函数会在创建时固定 sys.stderr 的值,如果后续重定向 stderr,该函数的输出不会受到影响。建议使用 kwargs 方法来避免这个问题。


Python中如何打印到标准错误输出(stderr)
https://119291.xyz/posts/python-print-to-stderr-guide/
作者
ww
发布于
2025年5月26日
许可协议