MCPcopy Index your code
hub / github.com/bpython/bpython / run_with_tty

Function run_with_tty

bpython/test/test_args.py:17–63  ·  view source on GitHub ↗
(command)

Source from the content-addressed store, hash-verified

15
16
17def run_with_tty(command):
18 # based on https://stackoverflow.com/questions/52954248/capture-output-as-a-tty-in-python
19 master_stdout, slave_stdout = pty.openpty()
20 master_stderr, slave_stderr = pty.openpty()
21 master_stdin, slave_stdin = pty.openpty()
22
23 p = subprocess.Popen(
24 command,
25 stdout=slave_stdout,
26 stderr=slave_stderr,
27 stdin=slave_stdin,
28 close_fds=True,
29 )
30 for fd in (slave_stdout, slave_stderr, slave_stdin):
31 os.close(fd)
32
33 readable = [master_stdout, master_stderr]
34 result = {master_stdout: b"", master_stderr: b""}
35 try:
36 while readable:
37 ready, _, _ = select.select(readable, [], [], 1)
38 for fd in ready:
39 try:
40 data = os.read(fd, 512)
41 except OSError as e:
42 if e.errno != errno.EIO:
43 raise
44 # EIO means EOF on some systems
45 readable.remove(fd)
46 else:
47 if not data: # EOF
48 readable.remove(fd)
49 result[fd] += data
50 finally:
51 for fd in (master_stdout, master_stderr, master_stdin):
52 os.close(fd)
53 if p.poll() is None:
54 p.kill()
55 p.wait()
56
57 if p.returncode:
58 raise RuntimeError(f"Subprocess exited with {p.returncode}")
59
60 return (
61 result[master_stdout].decode(getpreferredencoding()),
62 result[master_stderr].decode(getpreferredencoding()),
63 )
64
65
66class TestExecArgs(unittest.TestCase):

Callers 3

test_exec_dunder_fileMethod · 0.85

Calls 2

getpreferredencodingFunction · 0.90
closeMethod · 0.45

Tested by

no test coverage detected