import popen2
def _popen(cmd, timeout = 10, num_retry = 3, logfile = sys.stdout):
i = 0
is_timeout = False
while i <= num_retry:
print "%dth try"%i, cmd
sys.stdout.flush()
i += 1
t0 = time()
P = popen2.Popen3(cmd, True)
prompt = False
while time() < t0 + timeout and P.poll() == -1:
sleep(0.1)
sts = P.poll()
if sts == -1:
logfile.write(color_str("command [%s] timeout\n"%(cmd), fg_red))
if i < num_retry:
logfile.write(color_str("terminate and try again\n", fg_red))
logfile.flush()
is_timeout = True
os.kill(P.pid, signal.SIGTERM)
elif sts != 0:
for l in P.childerr.readlines():
logfile.write(l)
if i < num_retry:
logfile.write(color_str("try again\n", fg_red))
logfile.flush()
is_timeout = False
else:
is_timeout = False
break
logfile.write(color_str("return "+str(sts)+"\n", fg_red))
sys.stdout.flush()
if is_timeout:
return (sts, open("/dev/null", "r"))
else:
return (sts, P.fromchild)
按说popen2这个module应该已经deprecated,被subprocess module所取代。不过subprocess.Popen的poll()函数似乎有bug,总是返回None。所以只好还用“古老”的module。
No comments:
Post a Comment