Ваша команда оболочки работает, но она имеет дело с слишком большим количеством строк вывода и слишком большим количеством полей в строке.Более простое решение - указать команде ps
, что вам нужно указать только одну строку, а в этой строке - только одно поле, которое вас волнует.Например, в моей системе:
ps -o cmd h 979
выведет:
/usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
Флаг -o cmd
выведет только столбец CMD вывода, апараметр h
представляет команду для указания ps
опустить заголовок.Наконец, 979
- это идентификатор процесса, который указывает ps
выводить информацию только для этого процесса.
Этот вывод не совсем соответствует вашей проблеме, но достаточно похож.Ограничив вывод, мы избавляемся от необходимости в других командах, таких как grep
, awk
, ... На этом этапе мы можем использовать регулярное выражение для извлечения того, что нам нужно:
from __future__ import print_function
import re
import subprocess
pid = '979'
command = ['ps', '-o', 'cmd', 'h', pid]
output = subprocess.check_output(command)
pattern = re.compile(r"""
config-file= # Literal string search
.+\/ # Everything up to the last forward slash
([^.]+) # Non-dot chars, this is what we want
""", re.VERBOSE)
matched = pattern.search(output)
if matched:
print(matched.group(1))
Примечания
- Для регулярного выражения я использую многословную форму, позволяющую мне использовать комментарий для аннотирования моего шаблона.Мне нравится этот способ, поскольку регулярное выражение может быть трудно читать
- В вашей системе, пожалуйста, настройте часть "файл-конфигурации" для работы с выходными данными.