|
11 | 11 | import sys |
12 | 12 | import tempfile |
13 | 13 | import textwrap |
14 | | -import time |
15 | 14 | import threading |
| 15 | +import time |
16 | 16 | from typing import ( |
17 | 17 | IO, |
18 | 18 | Any, |
@@ -150,33 +150,42 @@ def kill(self) -> None: |
150 | 150 | self._own_ports.remove((hostname, port)) |
151 | 151 |
|
152 | 152 | def execute( |
153 | | - self, command: Sequence[Union[str, Path]], proc_name: Optional[str], **kwargs: Any |
| 153 | + self, |
| 154 | + command: Sequence[Union[str, Path]], |
| 155 | + proc_name: Optional[str] = None, |
| 156 | + **kwargs: Any, |
154 | 157 | ) -> subprocess.Popen: |
155 | 158 | output_to = None if self.debug_mode else subprocess.DEVNULL |
156 | | - proc_name = proc_name or command[0] |
| 159 | + proc_name = proc_name or str(command[0]) |
157 | 160 | kwargs.setdefault("stdout", output_to) |
158 | 161 | kwargs.setdefault("stderr", output_to) |
159 | 162 | stream_stdout = stream_stderr = None |
160 | 163 | if kwargs["stdout"] in (None, subprocess.STDOUT): |
161 | 164 | kwargs["stdout"] = subprocess.PIPE |
162 | | - def stream_stdout(): |
| 165 | + |
| 166 | + def stream_stdout() -> None: |
| 167 | + assert proc.stdout is not None # for mypy |
163 | 168 | for line in proc.stdout: |
164 | 169 | prefix = f"{time.time():.3f} {proc_name} ".encode() |
165 | 170 | try: |
166 | 171 | sys.stdout.buffer.write(prefix + line) |
167 | 172 | except ValueError: |
168 | 173 | # "I/O operation on closed file" |
169 | 174 | pass |
| 175 | + |
170 | 176 | if kwargs["stderr"] in (subprocess.STDOUT, None): |
171 | 177 | kwargs["stdout"] = subprocess.PIPE |
172 | | - def stream_stderr(): |
173 | | - for line in proc.stdout: |
| 178 | + |
| 179 | + def stream_stderr() -> None: |
| 180 | + assert proc.stderr is not None # for mypy |
| 181 | + for line in proc.stderr: |
174 | 182 | prefix = f"{time.time():.3f} {proc_name} ".encode() |
175 | 183 | try: |
176 | 184 | sys.stdout.buffer.write(prefix + line) |
177 | 185 | except ValueError: |
178 | 186 | # "I/O operation on closed file" |
179 | 187 | pass |
| 188 | + |
180 | 189 | proc = subprocess.Popen(command, **kwargs) |
181 | 190 | if stream_stdout is not None: |
182 | 191 | threading.Thread(target=stream_stdout, name="stream_stdout").start() |
|
0 commit comments