如何退出程序:使用 sys.stderr.write() 还是 print

76 投票
3 回答
73511 浏览
提问于 2025-04-15 23:24

我正在写一个小程序,需要多次退出这个程序。

我应该使用:

sys.stderr.write('好的,退出')
sys.exit(1)

还是直接用:

print '错误!'
sys.exit(1)

哪种方式更好,为什么?请注意,我需要这样做很多次。这个程序应该完全退出。

3 个回答

10

如果出现错误信息,通常应该发送到 stderr(标准错误输出)这个地方。不过,是否真的需要这样做,得看你的具体情况。如果你希望用户能够重定向 stdin(标准输入)、stderrstdout(标准输出),比如在用其他工具运行你的程序时,那你就需要确保状态信息和错误信息能够清晰地区分开来。

不过,如果只是你自己在用这个程序,可能就没必要太在意这些了。在这种情况下,你可以直接抛出一个异常,这样程序就会自动结束。

顺便说一下,你可以这样做:

print >>sys.stderr, "fatal error"     # Python 2.x
print("fatal error", file=sys.stderr) # Python 3.x
17

这两种方式是用来显示消息的。

print通常是输出到sys.stdout,而你知道sys.stderr是输出到哪里。了解一下stdinstdoutstderr之间的区别是很有必要的,具体可以参考这个链接

stdout应该用来输出正常的程序信息,而stderr则专门用来输出错误信息(也就是程序执行不正常时的情况)。有一些工具可以将这两种输出分开,这样使用你代码的人就能区分正常输出和错误信息。

print可以输出到任何像文件一样的对象,包括sys.stderr

print >> sys.stderr, 'My error message'

使用sys.stderr来输出错误信息而不是sys.stdout的好处有:

  1. 如果用户把stdout重定向到一个文件,他们仍然可以在屏幕上看到错误信息。
  2. 它是无缓冲的,所以如果sys.stderr被重定向到一个日志文件,程序崩溃之前记录错误的机会就更小。

值得注意的是,还有第三种方式可以提供结束消息:

sys.exit('My error message')

这会将消息发送到stderr并退出。

128
sys.exit('Error!')

来自文档的说明:

如果传入了其他类型的对象,
None相当于传入零,
而任何其他对象会被打印到sys.stderr,并且会导致退出代码为1。
特别是,sys.exit("一些错误信息")是当发生错误时快速退出程序的一种方法。

撰写回答