我想知道是否有办法在python脚本运行时停止它,而不会杀死它。
例如,我知道ctrl + z or c
会杀死当前进程..但我不想杀死该程序..
我的python程序一次只接受一个文件并执行一些作业。 每个文件大约需要10~20分钟,具体取决于文件的大小..目录中有很多文件..
但有时我必须让它完成当前正在处理的文件,在当前文件之后立即停止程序,而不是在工作中间将其删除。
我怎么能在python中这样做?如果可以,我想写这个python编码..
我已经尝试了
if os.path.exists(filename)
sys exit(0)
但是这一个,我必须在它运行时创建一个文件,这样当它到达那个文件时,它会停止......但不是这样做..我想看看是否有更好的方法来阻止它。
答案 0 :(得分:4)
但有时我必须让它完成当前正在处理的文件,在当前文件之后立即停止程序,而不是在工作中间将其删除。
这比Ctrl + Z更具体;你要求停止该计划,但不是马上。你可以使用信号。使用signal
设置信号处理程序,并在命令行使用kill -SIGWHATEVER
调用它。一般来说,信号处理程序应该只设置一个你定期检查的标志;它实际上不应该做任何事情"本身,因为你不知道你的节目在被呼叫时处于什么状态。
信号处理程序是一个在程序收到信号时被调用的函数。它们是使用signal.signal()
设置的。信号通过kill
程序或kill()
系统调用发送。你的处理程序看起来像这样:
stop = False
def handler(number, frame):
global stop
stop = True
signal.signal(signal.SIGUSR1, handler)
for file in files: # or whatever your main loop looks like
# Process one file
if stop:
break
答案 1 :(得分:1)
Ctrl+Z
只会暂停进程,而不会将其杀死。您可以稍后键入fg
以恢复它(“fg”代表“前景”。此外,您可以为“背景”运行“bg”)。根据您的描述,这听起来像是一个很好的解决方案,可以达到您想要的效果。
当然,这适用于任何进程,而不仅仅是python。
答案 2 :(得分:0)
您还可以捕获中断异常(Ctrl + C),然后处理未完成的文件并退出。
`def main():
try:
for file in file_list:
process(file)
except KeyboardInterrupt:
process(file)
raise Exception`