在Python中设置循环期间的超时



所以我在一个目录中运行一个循环,其中一个外部脚本,由子进程运行。Popen在目录中移动,并对每个文件执行计算。外部脚本有点不稳定,当它遇到不知道如何处理的文件时,偶尔会冻结。是否有一种方法来添加超时函数的子进程。打开,这样我就可以跳过那个文件,继续下一个文件?

编辑:这是我的循环:

def automate():
    os.chdir("/home/mlts/dir")
    working_dir = b"/home/mts/dir"
    for filename in os.listdir(working_dir):
        if filename.endswith(".MTS"):
            try:
                print("Performing calculations on {filename!r}...".format(**vars()))
                try:
                    os.remove("mts_tbl.txt")
                except OSError:
                    pass
                time.sleep(3)
                p = Popen(["run_command.command", "-f", "a"], cwd=working_dir, stdin=PIPE)
                p.communicate(input=b"n".join([b"1", str(filename), b"8", b"alloy-liquid", b"0", b"x", b"5", b"4", b"-1.6", b"4", b"1", b"0"]))

要在Python 2上强制使用timeout(其中stdlib中不存在.communicate(timeout=)),您可以使用threading.Timer():

p = Popen(...)
t = Timer(3, p.kill) # kill in 3 seconds
t.start()
p.communicate(...)
t.cancel() # no need to kill, the process is dead already

完整示例:

import os
import traceback
from glob import glob
from subprocess import Popen, PIPE
from threading import Timer
os.chdir("/home/mls/dir") #XXX assume mlts is a typo in the question
for filename in glob(b"*.MTS"):
    print("Performing calculations on {filename!r}...".format(**vars()))
    try:
        os.remove("mts_tbl.txt")
    except OSError:
        pass # ignore
    try:
        p = Popen(["run_command.command", "-f", "a"], stdin=PIPE) #XXX no cwd
        t = Timer(3, p.kill)
        t.start()
        p.communicate(input=b"n".join([b"1", filename,
                b"8nalloy-liquidn0nxn5n4n-1.6n4n1n0"]))
        t.cancel()
    except Exception:
        traceback.print_exc()

此代码假设您希望在父Python脚本的当前工作目录下运行子进程。

在Python 3或如果安装了subprocess32;您可以将timeout参数传递给.communicate()方法,而不是使用Timer()

相关内容

  • 没有找到相关文章

最新更新