【发布时间】:2017-02-04 00:32:59
【问题描述】:
我正在从 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 秒内完成,并且它是否不只是终止它。
【问题讨论】:
标签: python subprocess popen