[英]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.