Python子进程IOError:[Errno 4]

2024-09-28 20:56:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现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]系统调用中断

代码有弱点吗? 请告诉我如何删除例外


Tags: selfsignalreturnifdefstdoutlinetimeout
1条回答
网友
1楼 · 发布于 2024-09-28 20:56:23

在大多数情况下,只需重试您正在执行的任何系统调用,例如,subprocess模块有一个helper函数来忽略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

用法:

^{pr2}$

在python3.5中,它将自动发生。见PEP 0475 Retry system calls failing with EINTR。在

相关问题 更多 >