在Python中优雅地退出程序?

时间:2010-01-20 22:28:04

标签: python

我有一个以

运行的脚本
while True:
  doStuff()

如果我需要停止它,那么与此脚本进行通信的最佳方式是什么?但是如果它处于操作过程中我不想杀死它?

5 个答案:

答案 0 :(得分:7)

最好的方法是重写脚本,使其不使用while True:

可悲的是,不可能推测一种终止这种方法的好方法。

您可以使用Linux信号。

你可以使用计时器并在一段时间后停止。

您可以dostuff返回一个值,如果值为False则停止。

您可以检查本地文件,并在文件存在时停止。

您可以检查FTP站点以查找远程文件并停止该文件。

您可以在HTTP网页上查看指示您的循环是否应该停止或停止的信息。

您可以使用特定于操作系统的信息,例如信号量或共享内存。

答案 1 :(得分:7)

而且我假设你的意思是从python脚本之外进行杀戮。

我发现最简单的方法是

@atexit.register
def cleanup()
  sys.unlink("myfile.%d" % os.getpid() )

f = open("myfile.%d" % os.getpid(), "w" )
f.write("Nothing")
f.close()
while os.path.exists("myfile.%d" % os.getpid() ):
  doSomething()

然后终止脚本只需删除myfile.xxx,应用程序就会退出。如果只需要关闭一个脚本,即使同时运行同一脚本的多个实例,也可以使用它。它试图自己清理....

答案 2 :(得分:5)

我认为最优雅的是:

keep_running = true
while keep_running:
    dostufF()

然后dostuff()可以设置keep_running = false,只要不再想继续运行,然后while循环就会结束,并且所有内容都能很好地清理。

答案 3 :(得分:2)

如果这是一个控制台应用程序并按Ctrl + C退出就可以了,这可以解决您的问题吗?

try:
  while True:
    doStuff()
except KeyboardInterrupt:
  doOtherStuff()

我猜这种方法的问题在于你不会确切地控制doStuff在何时何地终止执行。

答案 4 :(得分:-1)

信号模块可以捕获信号并做出相应的反应吗?