簡體   English   中英

python subprocess32 超時,溢出錯誤

[英]python subprocess32 with timeout, 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,這會間歇性地發生(幾乎從未發生過),我使用的是帶有 subprocess32 庫的 python 2.7.11,這是一個 python 錯誤嗎?

好的,我檢查了 subprocess32.py,該行是這樣的

endtime = time.time() + timeout

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

所以基本上時間戳太大而無法轉換為 ac int,我可以做些什么來解決這個問題?

聽起來像一個錯誤好吧。

如果你有興趣,這里有一個解決辦法的建議:與其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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM