Python 3.9.6 - как результат выполнения subprocess.run разобрать через Regex
От: Lloret  
Дата: 10.09.21 21:40
Оценка:
        rxDrv = re.compile(r'^driver\:\s+\w+$', re.MULTILINE)
        allItf = netifaces.interfaces()
        for item in allItf:
            # get driver info
            cmd = f"{item}"
            p1 = subprocess.run(["ethtool", "-i", cmd], capture_output=True, text=True)
            qqq = repr(p1.stdout)
            drvName = rxDrv.search(qqq).group()
            print(drvName)


Получаю в результате None вместо имен драйверов. ЧЯДНТ?
python3 regex
Re: Python 3.9.6 - как результат выполнения subprocess.run разобрать через Regex
От: CaptainFlint http://flint-inc.ru/
Дата: 11.09.21 01:28
Оценка: 3 (1) +1
Здравствуйте, Lloret, Вы писали:

L>
L>        rxDrv = re.compile(r'^driver\:\s+\w+$', re.MULTILINE)
L>        allItf = netifaces.interfaces()
L>        for item in allItf:
L>            # get driver info
L>            cmd = f"{item}"
L>            p1 = subprocess.run(["ethtool", "-i", cmd], capture_output=True, text=True)
L>            qqq = repr(p1.stdout)
L>            drvName = rxDrv.search(qqq).group()
L>            print(drvName)
L>


Версии 3.9 под рукой нет, поэтому быстро проверить не могу, но использование repr() для получения строки вызывает у меня сильнейшее подозрение. На тех версиях питона, которые у меня есть, строка конвертируется в печатаемый вид, что в частности вызывает преобразование концов строк в фактический текст из обратного слэша и символа "n". Разумеется, регулярка из кода в таком тексте ничего не найдёт, ибо не сопоставит конец строки. Если там на выходе байты, а надо получить строку, то это делается иначе; например, вот тут приводят два возможных решения:
1. преобразовать строку, используя метод decode;
2. использовать байтовую регулярку вместо строковой: rb'...'.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: Python 3.9.6 - как результат выполнения subprocess.run разобрать через Regex
От: Буравчик Россия  
Дата: 11.09.21 10:02
Оценка:
Здравствуйте, Lloret, Вы писали:

L>Получаю в результате None вместо имен драйверов. ЧЯДНТ?


Попробуй регулярку без ^ и $.
Кроме того, в некоторых случаях ethtool не вернет драйвер — например, для lo

P.S. Драйвер можно получить из /sys
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.