Python中优雅地退出程序?

6

I have a script that runs as a

while True:
  doStuff()

如果我需要停止脚本,但又不想在它执行操作时将其终止,那么与该脚本进行通信的最佳方法是什么?

6个回答

9
我假设您的意思是在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文件,应用程序将自动退出。即使同时运行多个相同的脚本实例,您也可以使用此方法仅关闭其中一个。它还会尝试清理自己的残留。


7
最好的方法是重写脚本,不使用while True:
遗憾的是,无法猜测一个好的终止方式。
你可以使用Linux信号。
你可以使用计时器,在一段时间后停止。
如果dostuff返回一个值并且该值为False,则可以停止。
你可以检查本地文件,如果文件存在,则停止。
你可以检查FTP站点上是否存在远程文件,如果存在则停止。
你可以检查HTTP网页以获取指示循环是否应该停止或不停止的信息。
你可以使用特定于操作系统的东西,如信号量或共享内存。

谢谢您的快速回答,肯定有一些我没有想到的好主意。 - James

5

我认为最优雅的方式是:

keep_running = true
while keep_running:
    dostufF()

然后dostuff()可以在不再需要继续运行时设置keep_running = false,然后while循环结束,一切都会清理得很好。


2
如果这是一个控制台应用程序,并且通过按Ctrl+C退出可以解决您的问题,那么这是否可以解决您的问题?
try:
  while True:
    doStuff()
except KeyboardInterrupt:
  doOtherStuff()

我认为这种方法的问题在于你无法控制执行何时以及在doStuff的哪个位置终止。


0

很久以前我实现了这样一个东西。它捕捉Ctrl+C(或键盘中断)。它使用了我的包snuff-utils

安装方法:

pip install snuff-utils

from snuff_utils.graceful_exit import graceful_exit

while True:
    do_task_until_complete()
    if graceful_exit:
        do_stuff_before_exit()
        break

按下 Ctrl+C 将记录:

An interrupt signal has been received. The signal will be processed according to the logic of the application.

我追求的目标是在完成已经运行的任务后退出程序。
请注意多进程/多线程。它没有经过测试。

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

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