2015-05-11 3 views
0

Я реализую программу python, которая возвращает результат подпроцесса (например, 'ls'). Подпроцесс имеет такую ​​функцию, как подписка на непрерывный выход, более конкретный, он подписывает два результата, и существует короткий срок (около 1сек) между двумя результатами.Подпроцесс Python IOError: [Errno 4]

Итак, я разработал класс, как показано ниже, для подписки на этот вывод.

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] Прерванный системный вызов

Есть ли недостаток в коде? Пожалуйста, дайте мне знать, как удалить за исключением

+2

Вам необходимо опубликовать сообщение о трассировке, чтобы мы могли видеть, откуда это исключение. –

ответ

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.

 Смежные вопросы

  • Нет связанных вопросов^_^