从根本上说,当你的程序完成后退出是很有用的。 这里有五种(!)在 Python 中这样做的方法。
1.raise SystemExit()
我们可以通过引发一个SystemExit
异常来退出 Python 代码。
print("Done.")
raise SystemExit()
顶层解释器捕获这个特殊的异常类并触发其退出程序。这包括运行所有atexit
,删除所有对象,最后调用操作系统的退出函数等步骤。
SystemExit
我们可以用它来向调用程序发出错误发生的信号。
print("Woops.")
raise SystemExit(1)
(当Python以异常崩溃时,它使用的退出代码是1。)
如果你正在寻找一个快速的答案,你可以在这里停止阅读。 使用 raise SystemExit(<code>)
作为退出 Python 代码的最明显的方法,继续你的生活。
更隐蔽的是,我们可以传递SystemExit
任何对象,在这种情况下,Python 将把该对象的str()
打印到 stderr,并返回一个 1 的退出代码。
raise SystemExit("Woops.")
这可能很方便,但我认为明确一点会更清楚。
print("Woops.", file=sys.stderr)
raise SystemExit(1)
2.sys.exit()
我们也可以调用 sys.exit()
来退出 Python,可以选择退出代码。
import sys
sys.exit(1)
在这下面只做 raise SystemExit(<arg>)
(在C语言中)。
虽然sys.exit()
比raise SystemExit()
少了一点输入,但它确实需要导入,这有点不方便。而且它还隐藏了一个异常发生的细节。
3.exit()
和quit()
exit()
和quit()
是由 Python 的 模块添加的 "额外的内建程序"。这两个程序基本上都是调用 ,可以选择带退出代码,比如。site
raise SystemExit()
exit(1)
这看起来超级方便!我们不需要导入任何东西,而且名字很短。
不幸的是,site 模块是可选的。 我们可以通过运行带有-S
标志的 Python 来跳过加载它。在这种情况下,我们对quit()
或exit()
的调用仍然可以退出,但有一个NameError
异常。
$ python -S -c 'exit(1)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'exit' is not defined
因为exit()
和quit()
是可选的,我建议避免在你的程序中使用它们。 但是在 REPL 中使用它们很好,这就是它们存在的原因。 它们甚至在写的时候不带括号会打印使用信息,以帮助试图退出 REPL 的新用户。
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
该信息将我们引向...
4.Ctrl-D (来自 REPL)
Ctrl-D是退出的通用键盘快捷键。 它向当前程序发送EOF(文件结束),告诉它用户已经完成了输入,它应该退出。
Ctrl-D适用于每一个命令行程序,包括python
。所以最好学习这个快捷键,而不是使用Python特有的exit()
。然后你就可以退出bash
、zsh
、ipython
、sqlite
,以及其他任何命令行程序,而不用考虑它。
5.os._exit()
该 os._exit(n)
函数以给定的退出代码n
立即退出 Python。它通过直接调用底层操作系统的退出函数来实现。
与提高SystemExit
不同,使用os._exit()
可以阻止 Python 运行其正常的退出过程。这是非常具有破坏性的,通常是不可取的,因此有 "私有/危险 "的下划线 prefx。
我发现调用os._exit()
的唯一原因是在调试时,在调用SystemExit
不起作用的情况下。例如,在一个线程中,调用SystemExit
不会退出程序集 - 它只是停止线程。直接调用os._exit()
可以停止整个程序,这可以与几个位置良好的调试打印相结合,以检查状态。
所以,知道os._exit()
的存在是值得的,尽管你在日常生活中应该避免它。
奖励✨ 6.直接调用操作系统的退出函数
os._exit()
是我们操作系统底层退出函数的一个薄薄的包装。 我们可以通过Python的ctypes
模块直接调用这个函数。这并没有带来任何好处--事实上,这更糟糕,因为我们的代码不会在所有的操作系统上工作。但知道这一点很酷。
在 Linux/MacOS/其他 Unixes 上,退出函数在 C 标准库中以exit()
的形式存在。我们可以通过运行man 3 exit
看到它的细节 - Linux 的 man 页面在这里。我们可以像这样用ctypes
来调用它。
from ctypes import CDLL
from ctypes.util import find_library
libc = CDLL(find_library("libc"))
libc.exit(1)