从python命令行退出


152

要从Python命令行退出,我必须键入exit()。如果我输入exit,它会说

Use exit() or Ctrl-Z plus Return to exit

通常,当您键入时exit,您想退出该程序。当解释程序知道我要退出命令行时,为什么会给我上述错误?为什么不退出呢?我知道这并不重要,这是一个愚蠢的问题,但我很好奇。


它可能与通常()在最后调用函数的方式有关...否则,它可能(可能)是变量...或某种对象...
summea 2012年

是的,但是解释器知道我要退出,这就是为什么打印该消息的原因。否则它将打印一条错误消息。如果知道我要退出,就可以退出。
2012年

1
exit或exit()会向我抛出错误,大约占我在世界上发现的安装的20%。只有CTRL + Z + return可以正常工作。
Paulo Carvalho

Answers:


37

在我的python解释器exit中,实际上是一个字符串而不是一个函数- 'Use Ctrl-D (i.e. EOF) to exit.'。您可以输入以下内容来检查口译员type(exit)

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


14
Ctrl-Z是在Windows(以及DOS)上执行的操作,而在类似Unix的系统上将执行Ctrl-D。
Karl Knechtel 2012年

@KarlKnechtel啊,很高兴知道。我在Windows上编程的经验很少。
沙丘2012年

60

这对我有效,这是从python提示符中提取出来的最好方法。

出口()


4
我对这个答案感到困惑...问题本身说,他们已经知道这种方法exit()有效,并且他们想知道为什么exit没有parens无效。因此,此答案仅重复了部分问题,并未真正回答。
李·李

我有点想不回答这个问题就对这个答案投反对票,但是我认为对于大多数python安装来说,这是正确的。只是用户说这在他们的情况下不起作用,因此推荐它似乎……不正确。
person27

37

exit在命令行中键入时,它将查找具有该名称的变量并在其上调用__repr__(或__str__)。通常,您会得到如下结果:

<function exit at 0x00B97FB0>

但是他们决定为该exit对象重新定义该功能,以显示一条有用的消息。这是否是一个愚蠢的行为,是一个主观的问题,但它不“只是退出”的一个可能原因是:

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


4
在这种情况下,除非您真正的退出函数不在范围之内,否则import sys您将调用sys.exit()退出解释器。
迈克尔·狄龙

19

这个消息是__str__的属性exit

看这些例子:

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'

19

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


如果脚本遇到错误,似乎此方法不起作用。
blaylockbk

2
Ctrl-Break在Windows中一致地工作。Ctrl-DCtrl-Z在Windows中使用Python 2.7、3.4、3.6。但是在Python 3.7中,这些命令停止了工作,退出的最短ASCII序列是Ctrl-Z Enter
鲍勃·斯坦

14

在Windows上与Anaconda 4.5+和Python 3.6+一起使用

Ctrl+Z

要么

exit()

在某些情况下,您可能必须使用

Ctrl+Break

如果您的计算机没有Break钥匙,请参见此处


8

因为解释器不是您提供命令的外壳,所以它是-解释器。您提供的是Python代码。

Python的语法exit本身不可能是对象的名称。简单地引用一个对象实际上并不能做任何事情(read-eval-print循环通常会执行的操作除外;即显示该对象的字符串表示形式)。


6

您可以解决该问题。

PYTHONSTARTUP使用以下链接到python文件

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

这是如何运作的?

python命令行是一个read-evaluate-print-loop,也就是说,当您键入文本时,它将读取该文本,对其进行评估并最终打印结果。

键入时,exit()它将求值为类型的可调用对象,site.Quitter并调用其__call__退出系统的函数。键入时,exit它求值到相同的可调用对象,而不调用它,则将打印该对象,从而依次调用__repr__该对象。

我们可以通过链接__repr__来利用这一点__call__,从而获得预期的退出系统的行为,即使我们键入时exit不带括号也是如此。


4
他们努力使exit打印成为“有用的”字符串,但他们不能仅仅将其绑定以执行自然操作并退出解释器。每次都被迫键入括号令人沮丧。这个答案是完美的,应该被接受。
Przemek D '18年

3

要退出Python终端,只需执行以下操作:

exit()

请注意,这是一个函数,大多数用户在不调用它的情况下将其与退出混合使用,但是新的Pyhton终端会显示一条消息...

或作为快捷方式,按:

Ctrl + D

在键盘上...

Ctrl + D


1
您所说的一切已经包含在上面的答案中。
Przemek D


-1

“ exit”是可以在Python程序中使用的有效变量名。当您尝试查看该变量的值时,您不想退出解释器。


除非您分配给exit,否则您将覆盖此符号,并且exit()将不再起作用。尽管此符号是有效的变量名,但以这种方式使用它似乎不是一个很好的做法。
Przemek D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.