У меня есть исполняемый файл, для которого требуется tty (как stdin и stderr), и я хочу иметь возможность его протестировать.Я хочу ввести stdin и захватить выходные данные stdout и stderr, вот пример сценария:
# test.py
import sys
print("stdin: {}".format(sys.stdin.isatty()))
print("stdout: {}".format(sys.stdout.isatty()))
print("stderr: {}".format(sys.stderr.isatty()))
sys.stdout.flush()
line = sys.stdin.readline()
sys.stderr.write("read from stdin: {}".format(line))
sys.stderr.flush()
Я могу запустить это без tty, но это поймано .isatty
и каждый возвращает False:
import subprocess
p = subprocess.Popen(["python", "test.py"], stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write(b"abc\n")
print(p.communicate())
# (b'stdin: False\nstdout: False\nstderr: False\n', b'read from stdin: abc\n')
Я хочу захватить stdout и stderr, и все три возвращают True - как tty.
Я могу использовать pty
чтобы сделать tty stdin:
import subprocess
m, s = pty.openpty()
p = subprocess.Popen(["python", "test.py"], stdin=s, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdin = os.fdopen(m, 'wb', 0)
os.close(s)
stdin.write(b"abc\n")
(stdout, stderr) = p.communicate()
stdin.close()
print((stdout, stderr))
# (b'stdin: True\nstdout: False\nstderr: False\n', b'read from stdin: abc\n')
Я пробовал несколько перестановок, чтобы сделать stdout и stderr tty безрезультатно.
Вывод, который я хочу здесь:
(b'stdin: True\nstdout: True\nstderr: True\n', b'read from stdin: abc\n')