通常,您所做的已经足以将所有输出传递到变量。
一个例外是,如果您正在运行的程序
/dev/tty用于直接连接到其控制终端,并通过该终端而不是通过stdout(FD 1)和stderr(FD
2)发出输出。通常对安全敏感的IO(例如密码提示)执行此 *** 作,但很少看到。
为了证明这一点有效,您可以将以下代码完全复制并粘贴到Python shell中:
import subprocessexecutable = ['/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: ", outprint "stderr: ", err
……相反,为了证明该案例 无效 :
import subprocessexecutable = ['/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
在这种情况下,内容将直接写入TTY,而不是stdout或stderr。不使用提供伪造TTY的程序(例如
script或
expect)就无法捕获此内容。因此,使用
script:
import subprocessexecutable = ['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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)