【发布时间】:2018-10-23 16:56:30
【问题描述】:
我有一个需要 tty(如标准输入和标准错误)的可执行文件,并且希望能够对其进行测试。 我想输入标准输入,并捕获标准输出和标准错误的输出,这是一个示例脚本:
# 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 标准输入:
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')
【问题讨论】:
-
我还没有测试,但是
stdin=s, stdout=s, stderr=s呢? -
@Sraw 这不会捕获 stdout 或 stderr 的输出。但是很可能有一个使用它的解决方案......
-
@Sraw 我的直觉是这需要 3 个
pty.openpty()对,每个 stdin/stdout/stderr 一个,并以特定顺序写入、读取和关闭。我尝试了很多排列都无济于事。 -
@unutbu 你能粘贴这个作为答案吗?我很难看到它。也许我没有喝足够的咖啡......
标签: python subprocess popen tty