projects
/
python_utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add --run_profiler option.
[python_utils.git]
/
exec_utils.py
diff --git
a/exec_utils.py
b/exec_utils.py
index a52e206ad95496ebf4de9eb08f19df8073339d4a..282a325a461e289144b5a58b5a88ce4a90098c83 100644
(file)
--- a/
exec_utils.py
+++ b/
exec_utils.py
@@
-12,7
+12,9
@@
from typing import List, Optional
logger = logging.getLogger(__file__)
logger = logging.getLogger(__file__)
-def cmd_showing_output(command: str, ) -> int:
+def cmd_showing_output(
+ command: str,
+) -> int:
"""Kick off a child process. Capture and print all output that it
produces on stdout and stderr. Wait for the subprocess to exit
and return the exit value as the return code of this function.
"""Kick off a child process. Capture and print all output that it
produces on stdout and stderr. Wait for the subprocess to exit
and return the exit value as the return code of this function.
@@
-30,12
+32,13
@@
def cmd_showing_output(command: str, ) -> int:
sel = selectors.DefaultSelector()
sel.register(p.stdout, selectors.EVENT_READ)
sel.register(p.stderr, selectors.EVENT_READ)
sel = selectors.DefaultSelector()
sel.register(p.stdout, selectors.EVENT_READ)
sel.register(p.stderr, selectors.EVENT_READ)
- s
hould_exit = False
- while
not should_exit
:
+ s
tream_ends = 0
+ while
stream_ends < 2
:
for key, _ in sel.select():
char = key.fileobj.read(1)
if not char:
for key, _ in sel.select():
char = key.fileobj.read(1)
if not char:
- should_exit = True
+ stream_ends += 1
+ continue
if key.fileobj is p.stdout:
sys.stdout.buffer.write(char)
if char in line_enders:
if key.fileobj is p.stdout:
sys.stdout.buffer.write(char)
if char in line_enders:
@@
-45,6
+48,8
@@
def cmd_showing_output(command: str, ) -> int:
if char in line_enders:
sys.stderr.flush()
p.wait()
if char in line_enders:
sys.stderr.flush()
p.wait()
+ sys.stdout.flush()
+ sys.stderr.flush()
return p.returncode
return p.returncode
@@
-63,9
+68,7
@@
def cmd_with_timeout(command: str, timeout_seconds: Optional[float]) -> int:
subprocess.TimeoutExpired: Command '['/bin/bash', '-c', '/bin/sleep 2']' timed out after 0.1 seconds
"""
subprocess.TimeoutExpired: Command '['/bin/bash', '-c', '/bin/sleep 2']' timed out after 0.1 seconds
"""
- return subprocess.check_call(
- ["/bin/bash", "-c", command], timeout=timeout_seconds
- )
+ return subprocess.check_call(["/bin/bash", "-c", command], timeout=timeout_seconds)
def cmd(command: str, timeout_seconds: Optional[float] = None) -> str:
def cmd(command: str, timeout_seconds: Optional[float] = None) -> str:
@@
-115,15
+118,15
@@
def run_silently(command: str, timeout_seconds: Optional[float] = None) -> None:
)
)
-def cmd_in_background(
- command: str, *, silent: bool = False
-) -> subprocess.Popen:
+def cmd_in_background(command: str, *, silent: bool = False) -> subprocess.Popen:
args = shlex.split(command)
if silent:
args = shlex.split(command)
if silent:
- subproc = subprocess.Popen(args,
- stdin=subprocess.DEVNULL,
- stdout=subprocess.DEVNULL,
- stderr=subprocess.DEVNULL)
+ subproc = subprocess.Popen(
+ args,
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL,
+ )
else:
subproc = subprocess.Popen(args, stdin=subprocess.DEVNULL)
else:
subproc = subprocess.Popen(args, stdin=subprocess.DEVNULL)
@@
-135,6
+138,7
@@
def cmd_in_background(
subproc.wait(timeout=10.0)
except BaseException as be:
logger.exception(be)
subproc.wait(timeout=10.0)
except BaseException as be:
logger.exception(be)
+
atexit.register(kill_subproc)
return subproc
atexit.register(kill_subproc)
return subproc
@@
-149,4
+153,5
@@
def cmd_list(command: List[str]) -> str:
if __name__ == '__main__':
import doctest
if __name__ == '__main__':
import doctest
+
doctest.testmod()
doctest.testmod()