为什么要在subprocess.Popen中使用stdout = PIPE?

from subprocess import PIPE,Popen


p = Popen("ls -l",shell=True,stderr=PIPE,stdout=PIPE)

(out,err) = p.communicate()

print(out, err)

在上面的Popen调用中,如果我删除stdout=PIPE,则ls -l在输出中的每个列表之后,都会得到换行符。但是,如果使用stdout=PIPE,则\n显示如下,而不是换行符


b'total 67092\n-rw-r--r--  1 root root      171 May 27 09:08 new.py\n-rw-r--r--  1   

    root root       74 May 12 18:14 abcd.conf\n-rwxr-xr-x  1 root root     5948 May 13 13:21 abxyz.sh\ndrwxr-xr-x  2 root root     4096 May 13

12:39 log\ndrwxrwxrwx  3 root root     4096 May 14 16:02

newpy\n-rw-r--r--  1 root root      134 May 27 10:13

pipe.py\n-rw-r--r--  1 root root      155 May 27 10:07

proc.py\ndrwxrwxrwx  3 root root     4096 May 14 14:29 py\ndrwxr-xr-x

16 1000 1000\n' b''

PIPE在情况下究竟如何工作subprocess.Popen?我们为什么需要它?我也没有使用它就得到了正确的输出?我们是否正在使用它同时获取stderr和stdout?


慕桂英3389331
浏览 711回答 2
2回答

繁星点点滴滴

删除print()呼叫以查看区别。当您不将ls输出通过管道传输到Python时,它会直接显示在您的终端上。它的输出将发送到您的终端。如果将其通过管道传输到Python,则会看到整个内容以字节为单位,包括换行符字节(表示为\n)。如果希望换行符按原样打印,请对结果进行解码:print(out.decode('utf8'))

慕森王

ls写入stdout文件句柄,当不进行管道传输时,该文件句柄直接连接到终端。当您将其通过管道ls传输到Python时,您正在捕获对其进行的所有写入。ls是不是写什么stderr。当使用PIPEfor时stderr,您会看到err变量为空(b''是一个空字节值)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python