【问题标题】:Stdout captured from pipe in Python is truncated从 Python 中的管道捕获的标准输出被截断
【发布时间】:2010-10-03 02:07:24
【问题描述】:

我想在 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]

stdout的内容是:

>>> 打印标准输出 rc linux-image-2。 2.6.31-14.48 x86 上 2.6.31 版本的 Linux 内核映像 ii linux-image-2。 2.6.32-22.36 x86 上 2.6.32 版本的 Linux 内核映像 ii linux-image-2。 2.6.32-23.37 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-2。 2.6.32-24.43 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-2。 2.6.32-25.44 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-ge 2.6.32.25.27 通用 Linux 内核映像

但是,这与在 shell 中运行 dpkg --list | grep linux-image 不同:

cschol@blabla:~$ dpkg --list | grep linux 映像 rc linux-image-2.6.31-14-generic 2.6.31-14.48 x86 上版本 2.6.31 的 Linux 内核映像 ii linux-image-2.6.32-22-generic 2.6.32-22.36 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-2.6.32-23-generic 2.6.32-23.37 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-2.6.32-24-generic 2.6.32-24.43 x86 上 2.6.32 版的 Linux 内核映像 ii linux-image-2.6.32-25-generic 2.6.32-25.44 x86 上版本 2.6.32 的 Linux 内核映像 ii linux-image-generic 2.6.32.25.27 通用 Linux 内核映像

看第一行,可以看到Python中的输出被截断了:

rc linux-image-2。 2.6.31-14.48

而不是

rc linux-image-2.6.31-14-generic 2.6.31-14.48

为什么要这样做,有没有办法在 Python 中获得完全相同的输出?

【问题讨论】:

    标签: python subprocess pipe


    【解决方案1】:
    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 的输出更像您从终端看到的。

    【讨论】:

    • 这解决了我的问题。谢谢!这是您只需要知道的事情还是在任何地方都有记录? `man dpkg' 根本没有提到 LANG。
    • @cschol:不幸的是,我不知道任何文档;我碰巧在这里了解到这个问题:ubuntuforums.org/showthread.php?p=6943778#post6943778.
    【解决方案2】:

    没有必要使用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
    

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2016-07-09
      • 2021-12-25
      相关资源
      最近更新 更多