python 终止函数命令_关于终止:终止python脚本

sys.exit([arg])

Exit from Python. This is implemented by raising the

SystemExit exception, so cleanup actions specified by finally clauses

of try statements are honored, and it is possible to intercept the

exit attempt at an outer level.

The optional argument arg can be an integer giving the exit status

(defaulting to zero), or another type of object. If it is an integer,

zero is considered"successful termination" and any nonzero value is

considered"abnormal termination" by shells and the like. Most systems

require it to be in the range 0-127, and produce undefined results

otherwise. Some systems have a convention for assigning specific

meanings to specific exit codes, but these are generally

underdeveloped; Unix programs generally use 2 for command line syntax

errors and 1 for all other kind of errors. If another type of object

is passed, None is equivalent to passing zero, and any other object is

printed to stderr and results in an exit code of 1. In particular,

sys.exit("some error message") is a quick way to exit a program when

an error occurs.

Since exit() ultimately"only" raises an exception, it will only exit

the process when called from the main thread, and the exception is not

intercepted.

< /块引用>

请注意,这是退出的"好"方式。@下面的glyphTwistedMatrix指出,如果你想要一个"硬退出",你可以使用os.u exit(错误代码),尽管它在某种程度上可能是操作系统特有的(例如,它可能不采用Windows下的错误代码),而且它肯定不太友好,因为它不让解释器在进程结束之前进行任何清理。

假设sys.exit()不工作(不杀死进程,只杀死线程),如果由后台线程引发?

@cesium62:是的,sys.exit()在当前线程中引发了SystemExit异常。

是否有一种方法可以在不引发异常的情况下结束脚本?我已经通过print-to-stdout管道将脚本中的相关标志传递到popen中,因此本例中的异常会导致比正在解决的问题更多的问题。

为什么,当我使用这个方法时,我会得到以下警告:UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)。

需要更多的细节;也许这应该是它自己的问题?

@bill stackoverflow.com/questions/25007104/&hellip;

如果使用Tkinter,它不会停止根进程mainLoop及其显示的窗口。为此,您需要额外的root.destroy()行。

尽早终止Python脚本的一个简单方法是使用内置函数quit()。不需要导入任何库,而且它是高效和简单的。

例子:

1

2

3#do stuff

if this == that:

quit()

另外,sys.exit()将终止所有python脚本,但quit()只终止生成它的脚本。

您知道这个命令在python 2和python 3中的工作方式是否不同吗?

有人知道这是否会退出整个解释器,或者只是导致脚本停止执行?特别是:对于在Spyder中运行的脚本,使用python解释器可以保持交互,还是会被杀死?尝试停止脚本继续,但保持解释器的交互性。

对我来说,它说"退出"是没有定义的。我正在使用python 3。

我在python 3.7中,quit()停止解释器并关闭脚本。

另一种方法是:

1raise SystemExit

@Alessa:看起来更优雅,但不建议这样做:您直接提出一个内置的异常,而不是更可取的(和可重写的)sys.exit包装器

这对我来说是一个完美的方法:退出运行脚本,但不要退出空闲脚本。

虽然您通常更喜欢sys.exit,因为它比其他代码更"友好",但实际上它所做的只是引发一个异常。

如果您确定需要立即退出一个进程,并且您可能在某个异常处理程序中,该异常处理程序会捕获SystemExit,那么还有另一个函数os._exit,该函数会立即在C级别终止,并且不会执行解释器的任何正常下拉操作;例如,用"at exit"注册的钩子。未执行模块。

您也可以简单地使用exit()。

记住,sys.exit()、exit()、quit()和os._exit(0)会杀死python解释器。因此,如果它出现在由execfile()从另一个脚本调用的脚本中,它将停止两个脚本的执行。

请参见"停止执行用execfile调用的脚本"以避免这种情况。

1

2from sys import exit

exit()

作为一个参数,您可以传递一个退出代码,该代码将返回到OS。默认值为0。

在我的情况下,我甚至不需要进口出口。

我刚刚发现,在编写多线程应用程序时,raise SystemExit和sys.exit()都只会杀死正在运行的线程。另一方面,os._exit()退出了整个过程。这在这里讨论过。

下面的示例有两个线程。肯尼和卡特曼。卡特曼应该永远活下去,但肯尼是递归调用,应该在3秒后死亡。(递归调用不是最好的方法,但我有其他原因)

如果我们也希望卡特曼死在肯尼死的时候,肯尼应该和埃多克斯离开,否则,只有肯尼会死,卡特曼会永远活下去。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36import threading

import time

import sys

import os

def kenny(num=0):

if num > 3:

# print("Kenny dies now...")

# raise SystemExit #Kenny will die, but Cartman will live forever

# sys.exit(1) #Same as above

print("Kenny dies and also kills Cartman!")

os._exit(1)

while True:

print("Kenny lives: {0}".format(num))

time.sleep(1)

num += 1

kenny(num)

def cartman():

i = 0

while True:

print("Cartman lives: {0}".format(i))

i += 1

time.sleep(1)

if __name__ == '__main__':

daemon_kenny = threading.Thread(name='kenny', target=kenny)

daemon_cartman = threading.Thread(name='cartman', target=cartman)

daemon_kenny.setDaemon(True)

daemon_cartman.setDaemon(True)

daemon_kenny.start()

daemon_cartman.start()

daemon_kenny.join()

daemon_cartman.join()

嗨,回答得很好。请告诉我是否正确使用了这个:stackoverflow.com/a/40547039/5082406

完美!正是我需要的。

这似乎是处理令人讨厌的延期回电的唯一方法!(即多线程方法。)

我是个新手,但这肯定更干净,更可控。

1

2

3

4

5

6

7

8

9

10

11def main():

try:

Answer = 1/0

print Answer

except:

print 'Program terminated'

return

print 'You wont see this'

if __name__ == '__main__':

main()

Program terminated

1

2

3

4

5

6

7

8

9

10

11

12import sys

def main():

try:

Answer = 1/0

print Answer

except:

print 'Program terminated'

sys.exit()

print 'You wont see this'

if __name__ == '__main__':

main()

Program terminated Traceback (most recent call last): File"Z:\Directory\testdieprogram.py", line 12, in

main() File"Z:\Directory\testdieprogram.py", line 8, in main

sys.exit() SystemExit

< /块引用>

编辑

关键是,该计划的结束顺利和平,而不是"我已经停止了!!!!"

一个问题是,如果您在嵌套函数中并且只想退出,那么您要么必须将一个标志一直发送回顶部函数,要么返回到下一个级别。

如果您试图建议可以使用return终止脚本,这绝对是胡说八道。return所做的全部工作就是向调用函数返回一个值和一个控制流。在那里,它在调用调用return的函数之后继续执行。当然,如果return是脚本中的最后一条语句(如示例中所示),那么脚本将在调用后立即终止。

对于这种方法有一个强有力的论据:(1)从中间"退出"可以说是"goto",因此是一种自然的厌恶;(2)在图书馆中"退出"绝对是一种不好的做法(任何东西都可以成为图书馆),因为图书馆认为"不可恢复"的东西通常对调用者来说是好的。(注意:对于ExcExts使用异常是一个Python实用工作,对于C/C/+/Java DEVs总是不适当地调用EDCOX1×12)——因此Python程序员可能不会注意到这个代码气味的臭味);最后,(3)多线程代码(PythOnistas在历史上被忽略了)。

在python 3.5中,我尝试在不使用内置模块(例如sys、biopy)的情况下合并类似的代码,以停止脚本并向我的用户打印错误消息。下面是我的例子:

1

2

3

4

5

6## My example:

if"ATG" in my_DNA:

##

else:

print("Start codon is missing! Check your DNA sequence!");

exit(); ## as most folks said above

稍后,我发现只抛出一个错误更为简洁:

1

2

3

4

5## My example revised:

if"ATG" in my_DNA:

##

else:

raise ValueError("Start codon is missing! Check your DNA sequence!");

你可能感兴趣的:(python,终止函数命令)