Я хочу захватить определенный столбец из вывода команды, используя python 3

На машине ubuntu я хочу захватить второй столбец вывода команды «dpkg -l». Я использую python 3 и хочу использовать модуль подпроцесса. следующая команда:

fh=open("/tmp/test.out", 'wb') with subprocess.Popen(["dpkg", "-l"], stdout=subprocess.PIPE) as proc: fh.write(proc.stdout.read())

возвращается как под:

ii yum 3.4.3-3 all Advanced front-end for rpm ii zeitgeist-core 1.0-0ubuntu4 amd64 event logging framework - engine ii zenity 3.24.0-1 amd64 Display graphical dialog boxes from shell scripts ii zenity-common 3.24.0-1 all Display graphical dialog boxes from shell scripts ii zip 3.0-11build1 amd64 Archiver for .zip files ii zita-ajbridge 0.7.0-1 amd64 alsa to jack bridge ii zita-at1 0.6.0-1 amd64 JACK autotuner ii zita-lrx 0.1.0-3 amd64 Command line jack application providing crossover filters ii zita-mu1 0.2.2-2 amd64 organise stereo monitoring for Jack Audio Connection Kit ..... .....

Я хочу получить второй столбец, например:

.... .... yum zeitgeist-core zenity zenity-common zip .... .... etc etc

Пожалуйста, помогите

>>> with subprocess.Popen(["dpkg", "-l"], stdout=subprocess.PIPE) as proc: ... line1=proc.stdout.read() ... type(line1) ... <class 'bytes'>

тип - это байты. Как разбить. Когда я использую следующее:

>>> with subprocess.Popen(["dpkg", "-l"], stdout=subprocess.PIPE) as proc: ... line1=proc.stdout.read() ... line2=str(line) # the type is byte so I try to convert to string ... print(line2) ... 10

(выход испорчен)

0
задан 9 February 2018 в 11:37

9 ответов

Ваш способ получить вывод системных вызовов довольно устарел. Вместо этого используйте

subprocess.check_output()

:

#!/usr/bin/env python3
import subprocess

f = "/home/jacob/Desktop/output.txt"

lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines()
with open(f, "wt") as out:
    for l in lines:
        if l.startswith("ii"):
            out.write(l.split()[1] + "\n")

Замените f на фактический путь к выходному файлу.

Выходной файл:

...
...
apg
app-install-data
app-install-data-partner
apparmor
apport
apport-gtk
apport-retrace
apport-symptoms
appstream
apt
apt-transport-https
...
...

Примечание

Решение выше создаст файл, заканчивающийся пустой строкой. Если это проблема как-то, воспользуйтесь приведенным ниже решением.

#!/usr/bin/env python3
import subprocess

f = "/home/jacob/Bureaublad/output.txt"

lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines()
open(f, "wt").write(
    "\n".join([l.split()[1] for l in lines if l.startswith("ii")])
)
2
ответ дан 22 May 2018 в 13:13
  • 1
    Это делает именно то, что мне нужно. Удивительный и элегантный. Благодарю. – Ravi OpenSource 9 February 2018 в 14:23
  • 2
    @RaviOpenSource Отлично! Пожалуйста :) – Jacob Vlijm 9 February 2018 в 15:21

Ваш способ получить вывод системных вызовов довольно устарел. Вместо этого используйте

subprocess.check_output()

:

#!/usr/bin/env python3 import subprocess f = "/home/jacob/Desktop/output.txt" lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines() with open(f, "wt") as out: for l in lines: if l.startswith("ii"): out.write(l.split()[1] + "\n")

Замените f на фактический путь к выходному файлу.

Выходной файл:

... ... apg app-install-data app-install-data-partner apparmor apport apport-gtk apport-retrace apport-symptoms appstream apt apt-transport-https ... ...

Примечание

Решение выше создаст файл, заканчивающийся пустой строкой. Если это проблема как-то, воспользуйтесь приведенным ниже решением.

#!/usr/bin/env python3 import subprocess f = "/home/jacob/Bureaublad/output.txt" lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines() open(f, "wt").write( "\n".join([l.split()[1] for l in lines if l.startswith("ii")]) )
2
ответ дан 17 July 2018 в 21:15

Ваш способ получить вывод системных вызовов довольно устарел. Вместо этого используйте

subprocess.check_output()

:

#!/usr/bin/env python3 import subprocess f = "/home/jacob/Desktop/output.txt" lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines() with open(f, "wt") as out: for l in lines: if l.startswith("ii"): out.write(l.split()[1] + "\n")

Замените f на фактический путь к выходному файлу.

Выходной файл:

... ... apg app-install-data app-install-data-partner apparmor apport apport-gtk apport-retrace apport-symptoms appstream apt apt-transport-https ... ...

Примечание

Решение выше создаст файл, заканчивающийся пустой строкой. Если это проблема как-то, воспользуйтесь приведенным ниже решением.

#!/usr/bin/env python3 import subprocess f = "/home/jacob/Bureaublad/output.txt" lines = subprocess.check_output(["dpkg", "-l"]).decode("utf-8").splitlines() open(f, "wt").write( "\n".join([l.split()[1] for l in lines if l.startswith("ii")]) )
2
ответ дан 23 July 2018 в 21:54
words=line1.split(" ")
print(words[1])

слова тогда список строк и слов [1] - тот, который вы хотите.

0
ответ дан 22 May 2018 в 13:13
words=line1.split(" ") print(words[1])

слова тогда список строк и слов [1] - тот, который вы хотите.

0
ответ дан 17 July 2018 в 21:15

Обратите внимание, что dpkg -l по существу является интерфейсом к dpkg-query, а dpkg-query позволяет отформатировать выход. Из man dpkg:

dpkg-query actions See dpkg-query(1) for more information about the following actions. -l, --list package-name-pattern... List packages matching given pattern.

И man dpkg :

-l, --list [package-name-pattern...] List packages matching given pattern. -W, --show [package-name-pattern...] Just like the --list option this will list all packages matching the given pattern. However the output can be customized using the --showformat option.

Итак, вместо dpkg -l do:

dpkg-query -f '${Package}\n' -W

'${Package}' здесь не является переменной оболочки. Это спецификатор формата для dpkg-query.

2
ответ дан 17 July 2018 в 21:15
words=line1.split(" ") print(words[1])

слова тогда список строк и слов [1] - тот, который вы хотите.

0
ответ дан 23 July 2018 в 21:54

Обратите внимание, что dpkg -l по существу является интерфейсом к dpkg-query, а dpkg-query позволяет отформатировать выход. Из man dpkg:

dpkg-query actions See dpkg-query(1) for more information about the following actions. -l, --list package-name-pattern... List packages matching given pattern.

И man dpkg :

-l, --list [package-name-pattern...] List packages matching given pattern. -W, --show [package-name-pattern...] Just like the --list option this will list all packages matching the given pattern. However the output can be customized using the --showformat option.

Итак, вместо dpkg -l do:

dpkg-query -f '${Package}\n' -W

'${Package}' здесь не является переменной оболочки. Это спецификатор формата для dpkg-query.

2
ответ дан 23 July 2018 в 21:54

Другие вопросы по тегам:

Похожие вопросы: