Python中从管道捕获的标准输出被截断
我想在Ubuntu 10.04上用Python 2.6.5来获取dpkg --list | grep linux-image
的输出。
from subprocess import Popen
from subprocess import PIPE
p1 = Popen(["dpkg", "--list"], stdout=PIPE)
p2 = Popen(["grep", "linux-image"], stdin=p1.stdout, stdout=PIPE)
stdout = p2.communicate()[0]
标准输出的内容是:
>>> print stdout rc linux-image-2. 2.6.31-14.48 Linux kernel image for version 2.6.31 on x86 ii linux-image-2. 2.6.32-22.36 Linux kernel image for version 2.6.32 on x86 ii linux-image-2. 2.6.32-23.37 Linux kernel image for version 2.6.32 on x86 ii linux-image-2. 2.6.32-24.43 Linux kernel image for version 2.6.32 on x86 ii linux-image-2. 2.6.32-25.44 Linux kernel image for version 2.6.32 on x86 ii linux-image-ge 2.6.32.25.27 Generic Linux kernel image
不过,这和在命令行里运行dpkg --list | grep linux-image
的结果不一样:
cschol@blabla:~$ dpkg --list | grep linux-image rc linux-image-2.6.31-14-generic 2.6.31-14.48 Linux kernel image for version 2.6.31 on x86 ii linux-image-2.6.32-22-generic 2.6.32-22.36 Linux kernel image for version 2.6.32 on x86 ii linux-image-2.6.32-23-generic 2.6.32-23.37 Linux kernel image for version 2.6.32 on x86 ii linux-image-2.6.32-24-generic 2.6.32-24.43 Linux kernel image for version 2.6.32 on x86 ii linux-image-2.6.32-25-generic 2.6.32-25.44 Linux kernel image for version 2.6.32 on x86 ii linux-image-generic 2.6.32.25.27 Generic Linux kernel image
看第一行,你会发现Python里的输出被截断了:
rc linux-image-2. 2.6.31-14.48
而不是
rc linux-image-2.6.31-14-generic 2.6.31-14.48
为什么会这样?有没有办法在Python中得到完全一样的输出呢?
2 个回答
4
其实根本不需要用grep!
import subprocess
p1 = subprocess.Popen(["dpkg", "--list"], stdout=subprocess.PIPE, env={'LANG':'C'})
out,err=p1.communicate()
for o in out.split("\n"):
if "linux-image" in o:
print o
4
import subprocess
p1 = subprocess.Popen(["dpkg", "--list"], stdout=subprocess.PIPE, env={'LANG':'C'})
p2 = subprocess.Popen(["grep", "linux-image"], stdin=p1.stdout, stdout=subprocess.PIPE)
out,err=p2.communicate()
print(out)
dpkg
这个命令的输出结果是跟环境变量LANG的值有关的。如果在subprocess.Popen
中设置LANG=C
,那么dpkg
的输出就会更像你在终端看到的那样。