Разбор команды Linux с Python

1

Вот быстрый фрагмент моего кода с использованием pexpect:

child.expect('tc@')
child.sendline('ps -o args | grep lp_ | grep -v grep | sort -n')
child.expect('tc@')
print(child.before)
child.sendline('exit')

и затем вывод:

user@myhost:~/Python$ python tctest.py 
tc-hostname:~$ ps -o args | grep lp_ | grep -v grep | sort -n
/usr/local/bin/lp_server -n 5964 -d /dev/usb/lp1
/usr/local/bin/lp_server -n 5965 -d /dev/usb/lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp0 SERIAL#1 /var/run/lp/lp_pid/usb_lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp1 SERIAL#2 /var/run/lp/lp_pid/usb_lp1

user@myhost:~$

Там 4 строки вывода. Первые две строки отображаются с портом принтера, которому присвоено устройство USB (для EX: первая строка показывает порт 5964, присвоенный lp1)

3-я и 4-я строки показывают, какой серийный номер устройства присвоен порту USB. (EX: SERIAL # 1 назначается lp0)

Мне нужно как-то разобрать этот вывод, чтобы я мог сделать следующее:

If SERIAL#1 is not assigned to 5964:
    run some command
else:
    do something else
If SERIAL#2 is not assigned to 5965:
    run some command
else:
    do something else

Я не уверен, как манипулировать этим выходом, чтобы получить желаемые переменные. Любая помощь приветствуется.

  • 0
    Итак, все, что вам нужно, это серийные номера (5964, 5965) или вам нужно дополнительно SERIAL # 1 и SERIAL # 2 в качестве переменных?
  • 0
    внес изменения в мое заявление IF, чтобы уточнить. 5964 и 5965 - это не серийные номера, а порты принтера. Мне нужно проверить, какой серийный номер назначен порту принтера, а затем выполнять команды на основе этого.
Показать ещё 1 комментарий
Теги:

2 ответа

0
Лучший ответ

Вы можете извлекать порт и последовательную информацию из данных re.findall с помощью re.findall и делать что-то вроде этого

import re
data = child.before
ports = re.findall(r'lp_server -n (\d+)', data)
# ['5964', '5965']
serials = re.findall(r'(SERIAL#\d+)', data)
# ['SERIAL#1', 'SERIAL#2']

list(zip(ports, serials))
# [('5964', 'SERIAL#1'), ('5965', 'SERIAL#2')]

for serial, port in zip(ports, serials):
    # Check if serial and port matches expectation
  • 0
    Это было прекрасно. Спасибо!
0

Другой способ сделать это - использовать словари для построения отношений между серийными номерами устройств и портами принтера:

inString = """/usr/local/bin/lp_server -n 5964 -d /dev/usb/lp1
/usr/local/bin/lp_server -n 5965 -d /dev/usb/lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp0 SERIAL#1 /var/run/lp/lp_pid/usb_lp0
{lp_supervisor} /bin/sh /usr/local/lp/lp_supervisor /dev/usb/lp1 SERIAL#2 /var/run/lp/lp_pid/usb_lp1"""

inString = inString.split("\n")

matches = dict()
serials = dict()

for i in range(len(inString[:2])):
    lp = inString[i][-3:]
    printerPort = int(inString[i].split("-n ")[1][:4])
    matches.update({lp:printerPort})

for i in range(2,len(inString)):
    t = inString[i].split(" ")
    lp = t[3][-3:]
    serial = t[4]
    serials.update({serial:lp})

finalLookup = dict((k,matches[v]) for k,v in serials.items())
print(finalLookup)

Выход:

{'SERIAL#1': 5965, 'SERIAL#2': 5964}

Тогда вы можете сделать:

if not finalLookup['SERIAL#1'] == 5964:
    run some command
else:
    do something else
if not finalLookup['SERIAL#2'] == 5965:
    run some command
else:
    do something else

Ещё вопросы

Сообщество Overcoder
Наверх
Меню