2017-01-09 79 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(几乎没有,但它发生) ,即时通讯使用python 2.7.11与subprocess32库,这是一个Python的错误?

好吧,我检查subprocess32.py,行是这样的

endtime = time.time() + timeout 

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

所以基本上时间戳太大,转换成C INT,有什么我可以做,以解决这个问题?

回答

1

听起来像一个错误没事。

如果你有兴趣,这里有一个解决方法建议:不是communicate,从工艺stdout在一个线程读取和检查过程结束由要么没有更多的阅读或通过poll返回代码产量。由于你控制循环,你可以在主线程中等待1秒,并为超时倒计时(不需要额外的准确性,因为sleep可以漂移,但这会很简单)。到达0

import threading 

output = "" 

def subp(p): 
    global output 

    while True: 
     # read blocks but since we're in a thread it doesn't matter 
     data = proc.stdout.read() 
     if not data or proc.poll() != None: 
      break 
     output += data 

# here create the process  
proc = subprocess... 

# create a thread, pass the process handle 
t = threading.Thread(target=subp,args=(proc,)) 

while True: 
    if proc.poll() != None: 
     # exit: OK 
     break 
    timeout -= 1 
    if timeout < 0: 
     # took too long: kill 
     proc.terminate() 
     break 
    time.sleep(1) 

t.join() 
+0

当“!如果没有数据或proc.poll()=无:”还杀死进程“?如果不是proc.poll()”应该只是 – cakester

+1

common trap:'proc.poll()'可以返回返回码,它可以是0.所以它不能结束。但我认为我的解决方案是不正确的:'read'被阻止。所以暂停将不起作用。让我编辑。 –

+0

概念是正确的,我通过接受答案接受概念,代码我必须重写反正,所以我不知道D = – cakester