gpt4 book ai didi

python - 通过python终止一段时间内的程序

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:42 24 4
gpt4 key购买 nike

我正在从 python 脚本运行 fortran 代码,有时需要一段时间才能运行。因此,我使用取自 this link 的代码来限制运行时间。 :

def timeout(func, args=(), kwargs={}, timeout_duration=15, default=1):
import signal

class TimeoutError(Exception):
pass

def handler(signum, frame):
raise TimeoutError()

# set the timeout handler
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
finally:
signal.alarm(0)

return result

我基本上将另一个函数(部分在下面)放入这个函数(上面)中,以运行 fortran 代码:

subprocess.check_output('./../bin/SPhenoUMSSM ../UMSSM/LH_out_'+mod+' > SPheno_log_'+mod, shell=True)

但是我意识到,当 Fortran 代码花费超过 15 秒(这是超时函数的边界)时,它会留在核心中并执行 for 循环中的另一个循环,这会在我的核心中创建转储。为了防止这种情况,我想使用 subprocess.popen() ,因为它给我 pid 来终止核心中的作业,但我也需要等待进程执行,例如subprocess.check_output() 确实如此。因此,我想知道是否有一种方法可以结合 popen 和 check_output 属性来等待作业在 15 秒内完成,并且它是否只是终止该作业。

最佳答案

这不是世界上最复杂的代码,但它可能很有用。

import subprocess, time
x = subprocess.Popen(['sleep', '15'])
polling = None
i = 0
while polling == None:
time.sleep(1)
polling = x.poll()
i +=1
if i > 15: break
if polling == None:
try:
x.kill()
print "Time out - process terminated" # process terminated by kill command
except OSError:
print "Process completed on time" # process terminated between poll and kill commands
except Exception as e:
print "Error "+str(e) # kill command failed due to another exception "e"
else:
print "Process Completed after "+str(i)+" seconds"

编辑:kill 似乎不起作用的问题。
尝试使用 os.kill(x.pid, signal.SIGKILL) 而不是 SIGTERM
我相信 SIGTERM 要求进程彻底关闭,而不是立即终止。由于不知道 Fortran 脚本的驱动因素,因此很难知道终止信号的作用。也许代码正在做一些事情。
例如:
如果我运行 shell 脚本如下:

#!/bin/bash
trap "echo signal" 15
sleep 30

并发送它kill -15 pid_number,它不会打印“signal”,直到 sleep 在30秒后终止,而如果我发出kill -9 pid_number它将立即终止,不会打印任何内容。

简短的回答是,我不知道,但我怀疑答案就在运行 Fortran 代码的脚本中。

编辑:

注意:为了成功运行 x.kill()os.kill()subprocess.call('kill '+ str(x .pid), shell=True), x 中的 shell 选项需要为 False。因此可以使用

import shlex
args = shlex.split(ARGS HERE)
x = subprocess.Popen(args) # shell=False is default

但还要注意,如果您想使用 ... >& log_file 将输出写入日志文件,它将无法工作,因为 >& 不是有效的参数适用于您的脚本,但适用于您的 shell 环境。因此,只需使用对 python 运行的脚本有效的参数。

关于python - 通过python终止一段时间内的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39706661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com