На машине человечности я хочу получить второй столбец вывода команды "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
(Вывод испорчен),
Ваш способ получить вывод системных вызовов довольно устарел. Использовать
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")])
)
Отметьте это dpkg -l
по существу frontend к 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.
-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
, сделайте:
dpkg-query -f '${Package}\n' -W
'${Package}'
не переменная оболочки здесь. Это - спецификатор формата для dpkg-query
.
words=line1.split(" ")
print(words[1])
слова являются затем списком строк, и слова [1] тот, который Вы хотите.