Разбор вывода командной строки в Windows с Python - PullRequest
0 голосов
/ 06 октября 2019

По сути, я хочу получить некоторые значения из команды, такой как 'ipconfig', но когда я печатаю вывод команды, я получаю много символов новой строки и пробелов.

Код, который я пробовал:

>>> import subprocess
>>> output = subprocess.getstatusoutput("ipconfig")
>>> print(output)
(0, '\x0c\nWindows IP Configuration\n\n\nEthernet adapter Ethernet 2:\n\n   Media State . . . . . . . . . . . : Media disconnected\n   Connection-specific DNS Suffix  . : \n\nEthernet adapter Npcap Loopback Adapter:\n\n  
 Connection-specific DNS Suffix  . : \n   Link-local IPv6 Address . . . . . : ~e~~::7dab:~~7f:e56f:1131%9\n   Autoconfiguration IPv4 Address. . : 169.~~4.1~.49\n   
Subnet Mask . . . . . . . . . . . : 255.255.0.0\n   Default Gateway . . . . . . . . . : \n\nEthernet adapter VirtualBox Host-Only Network:\n\n   Connection-specific DNS Suffix  . : \n 
Link-local IPv6 Address . . . . . : fe80::7~~c:69aa:~~aa:~~14~10\n   IPv4 Address. . . . . . . . . . . : 192.168.~~.~\n   Subnet Mask . . . . . . . . . . . : 255.~~~.255.0\n   Default Gateway  . . . . : etc...

Я не уверен, что лучше всего проанализировать эти данные в какую-то таблицу с ключами и значениями

И при попытке использовать код из этого ответа на этот вопрос здесь , все, что я мог получить, было этой ошибкой:

>>> import subprocess
>>> output = subprocess.check_output("ipconfig", shell=True)
>>> result = {}
>>> for row in output.split('\n'):
...     if ': ' in row:
...         key, value = row.split(': ')
...         result[key.strip(' .')] = value.strip()
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> print(result)
{}
>>> print(result['A (Host) Record'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'A (Host) Record'

Пример того, что я ищу:

"Link-local IPv6 Address": "my ipv6 addr"

«Маска подсети»: «Маска моей подсети»

(Использование python 3)

1 Ответ

1 голос
/ 07 октября 2019

Мы получаем вывод, декодируем его так, чтобы он был str, затем перебираем его строки.

Мы будем хранить каждый отдельный адаптер как dict в dict с именем adapters.

На выходе перед деталями каждого адаптера находится строка, начинающаяся с "Ethernet adapter ". Мы получаем имя адаптера путем сращивания строки от строки "Ethernet adapter " до ":", который находится по индексу -1.

После этого предполагается любая строка с " : " вв нем есть подробности о текущем адаптере. Поэтому мы разбиваем строку на " : ", немного ее очищаем и используем их в качестве пар ключ / значение для нашей current_adapter dict, которую мы создали ранее.

import subprocess

adapters = {}
output = subprocess.check_output("ipconfig").decode()

for line in output.splitlines():
    term = "Ethernet adapter "
    if line.startswith(term):
        adapter_name = line[len(term):-1]
        adapters[adapter_name] = {}
        current_adapter = adapters[adapter_name]
        continue

    split_at = " : "
    if split_at in line:
        key, value = line.split(split_at)
        key = key.replace(" .", "").strip()
        current_adapter[key] = value



for adapter_name, adapter in adapters.items():
    print(f"{adapter_name}:")
    for key, value in adapter.items():
        print(f"    '{key}' = '{value}'")
    print()

Вывод:

Ethernet:
    'Connection-specific DNS Suffix' = ''
    'Link-local IPv6 Address' = 'fe80::...'
    'IPv4 Address.' = '192.168.255.255'
    'Subnet Mask' = '255.255.255.255'
    'Default Gateway' = '192.168.255.255'

VMware Network Adapter VMnet1:
    'Connection-specific DNS Suffix' = ''
    'Link-local IPv6 Address' = 'fe80::...'
    'IPv4 Address.' = '192.168.255.255'
    'Subnet Mask' = '255.255.255.255'
    'Default Gateway' = ''

VMware Network Adapter VMnet8:
    'Connection-specific DNS Suffix' = ''
    'Link-local IPv6 Address' = 'fe80::...'
    'IPv4 Address.' = '192.168.255.255'
    'Subnet Mask' = '255.255.255.255'
    'Default Gateway' = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...