退出Python命令行界面

187
退出 Python 命令行,我需要输入 exit()。如果我输入 exit,会显示:
Use exit() or Ctrl-Z plus Return to exit

通常当您键入exit时,您想要退出程序。为什么解释器知道我正在尝试退出命令行时会给我上面的错误?为什么它不直接退出?我知道这并不重要,这是个愚蠢的问题,但我很好奇。


可能与函数通常在末尾使用 () 有关...否则,可能是一个变量...或某种对象... - summea
1
正确,但解释器知道我正在尝试退出,这就是为什么它打印该消息的原因。否则它会打印错误消息。如果它知道我正在尝试退出,它可以直接退出。 - Ank
1
退出(exit或exit())对我发现的全球大约20%的安装会抛出错误... 只有CTRL+Z + 回车可以始终正常工作。 - Paulo Carvalho
1
我认为“exit”在所有Python版本中都不起作用(Windows上的“Ctrl-Z”,Linux上的“Ctrl-D”和“exit()”在所有Python版本中都可以使用)。 - gelonida
我在Windows上安装了Python,遇到了同样的问题。 "exit"不起作用,甚至没有给我任何提示。 我还尝试了quit和[Ctrl] [d],但都没有起作用。 甚至exit()或quit()也无法正常工作。 按下[Ctrl] [z],然后按[Return]就可以解决问题。 然而,有这样一个糟糕的用户体验,我想知道为什么人们最终会使用Python - 真是一场噩梦。 所有试图为这种丑陋行为辩护的答案都简单地忽略了UX的重点。 - Jörg
12个回答

74
这对我来说很有效,是摆脱Python提示符的最佳方法。
exit()

11
我对这个答案感到困惑...问题本身说他们已经知道 exit() 起作用,他们想知道为什么没有括号的 exit 不能起作用。所以这个答案只是重复了问题的一部分,实际上并没有回答问题。 - Ben Lee
1
我有点想给这个回答点个踩,因为它没有读懂问题,但我认为对于大多数Python安装来说,这是正确的;只是用户说在他们的情况下这行不通,所以推荐似乎是不恰当的。 - person27

59

在我的Python解释器中,exit实际上是一个字符串而不是一个函数 -- '使用 Ctrl-D (即 EOF) 退出.'。您可以通过输入type(exit)在您的解释器中检查。

在活动的Python中,exit是一个函数。如果您未调用该函数,它将打印对象的字符串表示形式。这是返回任何对象的默认行为。只是设计者认为人们可能会尝试键入exit来退出解释器,因此他们将退出函数的字符串表示形式设置为有用的消息。您可以通过键入str(exit)甚至print exit来检查此行为。


18
在Windows(以及DOS)中,你需要按下Ctrl-Z,而在类Unix系统中,则需要按下Ctrl-D。 - Karl Knechtel
@KarlKnechtel 噢,好的,知道了。我在 Windows 上编程的经验很少。 - Dunes

42
当你在命令行中键入exit时,它会查找具有该名称的变量并在其上调用__repr__(或__str__)。通常,你会得到类似这样的结果:
<function exit at 0x00B97FB0>

但是,他们决定重新定义exit对象的函数来显示一条有用的消息。无论这是否是一种愚蠢的行为都是一个主观问题,但它不能"只是退出"的一个可能原因是:

假设你正在使用调试器查看代码,其中一个对象引用了exit函数。当调试器尝试在该对象上调用__repr__来向您显示该函数时,程序突然停止!这将非常出乎意料,采取措施来对抗这种行为可能会进一步复杂化事情(例如,即使将该行为限制为命令行,如果您尝试打印具有exit作为属性的某些对象会怎样?)


5
在这种情况下,真正的退出功能甚至不在作用域内,除非你import sys,之后你将调用sys.exit()来退出解释器。 - Michael Dillon

28

在 Windows 上使用 Anaconda 4.5+ 和 Python 3.6+,请使用以下命令:

Ctrl+Z
或者
exit()

在某些情况下,您可能需要使用

Ctrl+Break

如果你的电脑没有Break键,那么看这里


26

我建议您使用 Ctrl-D 退出 Python 解释器。这是表示文件结尾或传输结束的旧 ASCII 代码。


似乎如果脚本遇到错误,这种方法就不起作用了。 - blaylockbk
8
在Windows系统中,Ctrl-Break 始终有效。对于Python 2.7、3.4和3.6版本,Ctrl-DCtrl-Z 在Windows系统中也是有效的。但是,在Python 3.7版本中,这些快捷键不再起作用,最短的ASCII序列是 Ctrl-Z Enter - Bob Stein
Ctrl-Break、Ctrl-D、Ctrl-Z、Ctrl-Z+Enter:这些按键都无法让我在终端上停止一个简单的Python脚本,只有关闭终端才能停止。为什么会这样?我正在运行Python 3.7版本。 - GyRo

21

这条信息是exit__str__属性。

看看这些例子:

1

>>> print exit
Use exit() or Ctrl-D (i.e. EOF) to exit
2
>>> exit.__str__()
'Use exit() or Ctrl-D (i.e. EOF) to exit'

3

>>> getattr(exit, '__str__')()
'Use exit() or Ctrl-D (i.e. EOF) to exit'

11
因为解释器不是一个你提供命令的Shell,而是一种解释器。你提交的内容是Python代码。
Python的语法使得“exit”本身无法成为除了对象名称外的任何其他东西。简单地引用一个对象实际上不能做任何事情(除了读取-评估-打印循环通常会做的事情;即显示对象的字符串表示形式)。

11年后:理论上,由于解释器打印计算结果的字符串表示形式,所以必要的逻辑可以放在exit实例化的类的__repr__中。然而,这会导致令人惊讶和不一致的行为,特别是在比较脚本和解释器中发生的情况时。 - Karl Knechtel

9

您可以解决这个问题。

PYTHONSTARTUP 链接到一个包含以下内容的 Python 文件。

# Make exit work as expected
type(exit).__repr__ = type(exit).__call__

这是怎么运作的?

Python命令行是一个读取-求值-打印循环环境,也就是当你输入文本时,它会读取该文本,对其进行求值,并最终打印结果。

当你输入 exit() 时,它被求值为一个类型为 site.Quitter 的可调用对象,并调用它的 __call__ 函数以退出系统。当你输入 exit 时,它被求值为同样的可调用对象,但不会调用它,而是将对象打印出来,从而调用对象上的 __repr__ 函数。

我们可以通过将 __repr__ 链接到 __call__ 上来利用这一点,从而即使在没有括号的情况下输入 exit ,也能获得预期的退出系统行为。


4
他们花了功夫让 exit 命令打印出 "helpful" 字符串,但是他们不能直接绑定它来执行自然的退出解释器操作。每次被迫输入括号很令人沮丧。这个答案很完美,应该成为被接受的答案。 - Przemek D

5
要退出Python终端,只需执行以下命令:

exit()

exit()

请注意,这是一个被称为“退出但不调用”的函数,大多数用户会将其与正常退出混淆,但新的Python终端会显示一条消息...
或者,您可以按以下快捷键:
Ctrl + D

在您的键盘上...

ctrl + D

按下 Ctrl 和 D 键。

3
您所说的内容已经在上面的回答中涵盖了。 - Przemek D

0
如果你卡在了Python命令行中,而且以上的解决方法都不起作用,那么试试exit(2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接