2010-10-03 23 views
2

我想在Ubuntu 10.04的Python 2.6.5中捕获dpkg --list | grep linux-image的输出。在Python中从管道捕获的Stdout被截断

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 

然而,这是不一样的shell中运行dpkg --list | grep linux-image

 
[email protected]:~$ 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中完全相同的输出?

回答

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环境变量的值。 设置LANG=Csubprocess.Popen将使dpkg的输出更像你从终端看到的。

+0

这解决了我的问题。谢谢!这是你必须知道的东西,还是在任何地方都有记录? “man dpkg”根本没有提到LANG。 – cschol 2010-10-03 02:44:15

+1

@cschol:不幸的是,我不知道任何文档;我碰巧在这里了解这个问题:http://ubuntuforums.org/showthread.php?p=6943778#post6943778。 – unutbu 2010-10-03 12:18:27

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 
+0

+1消除使用'grep'。谢谢! – cschol 2010-10-03 02:53:21