Make the new cmd_showing_output select and display data from stderr in
authorScott <[email protected]>
Thu, 20 Jan 2022 22:45:34 +0000 (14:45 -0800)
committerScott <[email protected]>
Thu, 20 Jan 2022 22:45:34 +0000 (14:45 -0800)
addition to stdout.

exec_utils.py

index 36d48fad2b4c3191c0db0c612a58db502e6be197..edbd21f5497b43fef739c4e1998cd62cdb695ea5 100644 (file)
@@ -2,6 +2,7 @@
 
 import atexit
 import logging
+import selectors
 import shlex
 import subprocess
 import sys
@@ -21,11 +22,23 @@ def cmd_showing_output(command: str) -> None:
         stderr=subprocess.PIPE,
         universal_newlines=False,
     )
-    for char in iter(lambda: p.stdout.read(1), b''):
-        sys.stdout.buffer.write(char)
-        if char in line_enders:
-            sys.stdout.flush()
-    p.wait()
+    sel = selectors.DefaultSelector()
+    sel.register(p.stdout, selectors.EVENT_READ)
+    sel.register(p.stderr, selectors.EVENT_READ)
+    while True:
+        for key, _ in sel.select():
+            char = key.fileobj.read(1)
+            if not char:
+                p.wait()
+                return
+            if key.fileobj is p.stdout:
+                sys.stdout.buffer.write(char)
+                if char in line_enders:
+                    sys.stdout.flush()
+            else:
+                sys.stderr.buffer.write(char)
+                if char in line_enders:
+                    sys.stderr.flush()
 
 
 def cmd_with_timeout(command: str, timeout_seconds: Optional[float]) -> int: