2017-01-09 1 views
1

это мой журналпитон subprocess32 с тайм-аут, OverflowError

File "/opt/ibm/db2-governor/helpers/utils.py", line 10, in run_cmd 
output = proc.communicate(timeout = timeout)[0] 
    File "/opt/ibm/dynamite/python/lib/python2.7/site-packages/subprocess32.py", line 927, in communicate 
    stdout, stderr = self._communicate(input, endtime, timeout) 
    File "/opt/ibm/dynamite/python/lib/python2.7/site-packages/subprocess32.py", line 1713, in _communicate 
    orig_timeout) 
    File "/opt/ibm/dynamite/python/lib/python2.7/site-packages/subprocess32.py", line 1786, in _communicate_with_poll 
    ready = poller.poll(self._remaining_time(endtime)) 
OverflowError: Python int too large to convert to C lon 

поэтому код, который вызывает это

output = proc.communicate(timeout = timeout)[0] 

таймаут установлен в 20, это не происходит intermitently (почти никогда, но это бывает) , im используя python 2.7.11 с библиотекой subprocess32, является ли это ошибкой python?

нормально, я проверил subprocess32.py, линия идет как этот

endtime = time.time() + timeout 

ready = poller.poll(self._remaining_time(endtime)) 

поэтому в основном временные метки слишком большой, чтобы преобразовать в с Int, есть все, что я могу сделать, чтобы решить эту проблему?

ответ

1

Звучит как ошибка.

Если вы заинтересованы, вот обходной путь предложение: вместо communicate, читать из процесса stdout в потоке и проверить, если процесс закончится либо больше ничего читать или вернуть выход кода через poll.

Поскольку вы управляете петлей, вы можете подождать 1 секунду в основном потоке и обратном отсчете для таймаута (не слишком точный, так как sleep может дрейфовать, но это было бы достаточно хорошо & просто). Также убейте процесс, когда достигнет 0.

+0

«Если не данные или proc.poll()! = Нет:« должно быть просто », если не proc.poll()?» – cakester

+1

Общая ловушка: 'proc.poll()' может возвращать код возврата, который может быть равен 0. Поэтому он не может закончиться. Но я думаю, что мое решение неверно: 'read' блокирует. Таким образом, тайм-аут не будет иметь никакого эффекта. Позвольте мне изменить. –

+0

Концепция правильная, и я согласен с концепцией, принимая ответ, код, который я должен переписать в любом случае, поэтому я не знаю. D = – cakester

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