Stdout, захваченный из канала в Python, усекается

Я хочу зафиксировать вывод dpkg --list | grep linux-image в Python 2.6.5 на Ubuntu 10.04.

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:

>>> 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?


person cschol    schedule 03.10.2010    source источник


Ответы (2)


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=C в subprocess.Popen сделает вывод dpkg более похожим на то, что вы видите в терминале.

person unutbu    schedule 03.10.2010
comment
Это решило мою проблему. Спасибо! Это то, что вам просто нужно знать, или это где-то задокументировано? `man dpkg' вообще не упоминает LANG. - person cschol; 03.10.2010
comment
@cschol: К сожалению, я не знаю никакой документации; Я узнал об этой проблеме здесь: ubuntuforums.org/showthread.php?p=6943778 #post6943778. - person unutbu; 03.10.2010

Нет необходимости использовать 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
person ghostdog74    schedule 03.10.2010