Добавлен параметр timeout на выполнение команды

master-3.5
Mike Hiretsky 6 years ago
parent 638b197406
commit 585133ab60

@ -113,6 +113,8 @@ class PipeProcess(StdoutableProcess):
def get_stdout(self): def get_stdout(self):
return PIPE return PIPE
class ProcessTimeout(FilesError):
pass
class process(StdoutableProcess): class process(StdoutableProcess):
"""Execute system command by Popen """Execute system command by Popen
@ -160,6 +162,7 @@ class process(StdoutableProcess):
self.envdict = kwarg.get("envdict", os.environ.copy()) self.envdict = kwarg.get("envdict", os.environ.copy())
self.envdict["LANG"] = kwarg.get('lang', 'C') self.envdict["LANG"] = kwarg.get('lang', 'C')
self.langc = "langc" in kwarg self.langc = "langc" in kwarg
self.timeout = kwarg.get("timeout", None)
self.stderr = kwarg.get("stderr", PIPE) self.stderr = kwarg.get("stderr", PIPE)
self.cwd = kwarg.get("cwd", None) self.cwd = kwarg.get("cwd", None)
@ -226,7 +229,10 @@ class process(StdoutableProcess):
_stderr = self.pipe.stderr.fileno() _stderr = self.pipe.stderr.fileno()
reads = [_stdout, _stderr] reads = [_stdout, _stderr]
while True: while True:
ret = select.select(reads, [], []) ret = select.select(reads, [], [], self.timeout)
if not ret[0]:
self.kill()
raise ProcessTimeout()
for fd in ret[0]: for fd in ret[0]:
if fd == _stdout: if fd == _stdout:
s = self.pipe.stdout.readline() s = self.pipe.stdout.readline()
@ -264,7 +270,11 @@ class process(StdoutableProcess):
try: try:
self._open() self._open()
if self.cacheresult is None: if self.cacheresult is None:
self.cacheresult, self.cacheerr = self.pipe.communicate() if self.timeout is None:
self.cacheresult, self.cacheerr = self.pipe.communicate()
else:
for line in self.readByLine():
pass
return self.cacheresult return self.cacheresult
except KeyboardInterrupt: except KeyboardInterrupt:
self.kill() self.kill()

Loading…
Cancel
Save