Python子进程IOError:[Errno 4]

时间:2015-05-11 05:28:27

标签: python subprocess ioerror

我正在实现python程序,它返回子进程的结果(比如'ls')。 子流程具有订阅连续输出等功能,更具体,订阅两个结果,两个结果之间存在短期(约1秒)。

所以,我设计了一个类似下面的类来订阅输出。

class Subscribe:
    def __init__(self, sec):
        self.m_sec = sec
    def subscribeResult(self, p):
        self.m_timeout = False
        signal.signal(signal.SIGALRM, self.handleTimeout)
        signal.alarm(self.m_sec)
        returnValue = ""

        try:
            with p.stdout:
                for line in iter(p.stdout.readline, b''):
                    if self.m_timeout:
                        signal.alarm(0)
                        p.kill()
                        return "timeout"
                    returnValue += line
            p.stdout.close()
            p.wait()
        exception Exception, inst:
            print inst
            signal.alarm(0)
            p.kill()
            return "except"

        signal.alarm(0)
        rv = returnValue.strip()
        if rv == "":
            return "null"
        return rv
    def handleTimeout(self, signum, frame):
        self.m_timeout = True

它运行良好,但很少引发IO异常,如下所示。 :IOError:[Errno 4]系统调用中断

代码中有弱点吗? 请告诉我如何删除异常

1 个答案:

答案 0 :(得分:0)

在大多数情况下,只需重试您正在执行的任何系统调用,例如,subprocess模块有一个辅助函数来忽略EINTR错误:

def _eintr_retry_call(func, *args):
    while True:
        try:
            return func(*args)
        except (OSError, IOError) as e:
            if e.errno == errno.EINTR:
                continue
            raise

用法:

readline = _eintr_retry_call(p.stdout.readline)

在Python 3.5中,它会自动发生。请参阅PEP 0475 -- Retry system calls failing with EINTR