一般来说,您所做的已经足够将所有输出传递给变量。在
一个例外是,如果正在运行的程序使用/dev/tty直接连接到其控制终端,并通过该终端而不是通过stdout(fd1)和stderr(fd2)发出输出。这通常用于对安全敏感的IO,如密码提示,但很少在其他情况下看到。在
为了证明这一点,您可以完全按照给定的方式将以下内容复制并粘贴到Python shell中:import subprocess
executable = ['/bin/sh', '-c', 'echo stdout; echo stderr >&2']
p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print " -"
print "output: ", out
print "stderr: ", err
……相比之下,为了证明不起作用:
^{pr2}$
在这种情况下,内容直接写入TTY,而不是stdout或stderr。如果不使用提供假TTY的程序(例如script或expect),则无法捕获此内容。因此,要使用script:import subprocess
executable = ['script', '-q', '/dev/null',
'/bin/sh', '-c', 'echo uncapturable >/dev/tty']
p = subprocess.Popen(executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print " -"
print "output: ", out