Найти в Дзене
Рабочий уголок

Python головного мозга

Версия Python 3.11.9 - https://www.python.org/downloads/ Проект https://cloud.mail.ru/public/zq5N/P8EE93umK "Пчёлы — полезные насекомые: они дарят целебные и уникальные по своему составу продукты, такие как мёд, пергу, маточное молочко, прополис, воск, а также опыляют растения (Яндекс)." - прочитал я и решил, что и мне не помешают полезные помощники, которые бы, например, собрали информацию о моей системе и железе. Запустив руки в интернет удалось выяснить, что для операционной системы Windows существует WMI API, который предоставляет относительно удобный доступ к нужной мне информации. Инструментарий управления Windows (WMI) — это инфраструктура для управления данными и операциями в операционных системах windows. Хотя вы можете создавать скрипты WMI или приложения для автоматизации административных задач на удаленных компьютерах, WMI также предоставляет данные управления другим частям операционной системы и продуктам. Необходимо найти и записать следующую информацию в файл: Первым де
Оглавление

Версия Python 3.11.9 - https://www.python.org/downloads/

Проект https://cloud.mail.ru/public/zq5N/P8EE93umK

Проект - "ПЧЕЛА"

"Пчёлы — полезные насекомые: они дарят целебные и уникальные по своему составу продукты, такие как мёд, пергу, маточное молочко, прополис, воск, а также опыляют растения (Яндекс)." - прочитал я и решил, что и мне не помешают полезные помощники, которые бы, например, собрали информацию о моей системе и железе.

Запустив руки в интернет удалось выяснить, что для операционной системы Windows существует WMI API, который предоставляет относительно удобный доступ к нужной мне информации.

Инструментарий управления Windows (WMI) — это инфраструктура для управления данными и операциями в операционных системах windows. Хотя вы можете создавать скрипты WMI или приложения для автоматизации административных задач на удаленных компьютерах, WMI также предоставляет данные управления другим частям операционной системы и продуктам.

Задачи.

Необходимо найти и записать следующую информацию в файл:

  • Наименование и версия операционной системы
  • Наименование материнской платы
  • Наименование процессора, количество ядер и потоков
  • Наименование видеокарты
  • Наименование ОЗУ, его объем и частоту
  • Наименование ПЗУ, его объем
  • Наименование сетевой и звуковой карты

Приступим.

Первым делом создаем README.mk где подробно напишем чем занимается наша программа и как ее зовут.

Затем, командой pip install WMI, подтягиваем последнюю версию библиотеки WMI и создаем requirements.txt (pip freeze > requirements.txt).

Импортируем библиотеку и создаем две константы:

  1. machine - объект класса WMI
  2. WMI_PROVIDERS - словарь хранит наименование компонента и "путь", где можно найти информацию о нем
  3. PARAMETERS - список параметров которые мы будем искать для каждого компонента
from wmi import WMI
machine = WMI()
WMI_PROVIDERS = {'Операционная система':machine.Win32_OperatingSystem(),
'Материнская плата': machine.Win32_BaseBoard(),
'БИОС': machine.Win32_BIOS(),
'Процессор': machine.Win32_Processor(),
'Видеокарта': machine.Win32_VideoController(),
'ОЗУ': machine.Win32_PhysicalMemory(),
'ПЗУ': machine.Win32_DiskDrive(),
'Сетевая карта': machine.Win32_NetworkAdapter(),
'Звуковая карта': machine.Win32_SoundDevice()
}
PARAMETERS = ['Caption', 'Name', 'Manufacturer', 'Version', 'PhysicalAdapter', 'NumberOfCores', 'ThreadCount', 'ConfiguredClockSpeed', 'FormFactor', 'OSArchitecture', 'Size', 'Product']

Программа будет состоять из трех методов.

Метод "bee()" - будет выполнять основную логику программы: идти по списку WMI_PROVIDERS собирать информацию, а затем записывать все в файл.

def bee() -> None:
"""
Метод 'Пчела' реализует основную логику программы: сбор информации и
распечатка ее в файл.
:return: None
"""
path_file = 'system_info.txt'
with open(file=path_file, mode='w', encoding='UTF-8') as file:
for sys_element, providers in WMI_PROVIDERS.items():
information = gather_information(providers)
save_to_a_file(sys_element, information, file)

Метод "gather_information" - принимает на вход объект wmi, в котором ищет все параметры из списка PARAMETERS.

def gather_information(providers: object, parameters=None) -> list:
"""
Метод принимает на вход список параметров и путь, где их искать.
Возвращает - список  словарей (компонент: параметр).
:param: providers: object WMI
:param: parameters: list()
:return: list()
"""
if parameters is None:
parameters = PARAMETERS
info_sheet = []
for provider in providers:
information = dict()
for param in parameters:
try:
information[param] = (provider.__getattr__(param))
# Отлавливаем исключения, которые возникают при
отсутствие параметра.
except AttributeError as error:
information[error.name] = None
# Здесь необходимо явно указать условие False, иначе python
воспримет 0 или None за ложь и пропустит некоторые
параметры.
if information.get('PhysicalAdapter') == False:
pass
# Переводим байты в гигабайты. Актуально для ПЗУ.
elif size := information.get('Size'):
information['Size'] = int(size) // 1024 ** 3
info_sheet.append(information)
else:
info_sheet.append(information)
return info_sheet

Метод "save_to_a_file" - принимает на вход наименование компонента, информацию о нем и объект файлового менеджера, после чего красиво распечатывает найденную информацию.

def save_to_a_file(sys_element: str, information: list, file: object) -> None:
"""
Метод принимает на вход имя системного элемента, словарь с
ифнмормацией о нем и объект контекстного менеджера. Проходя по всем
элементам словаря, в файл записывается вся полезная информаци.
:param: sys_element: str
:param: information: list()
:param: file: object()
:return: None
"""
file.write(f'\n{sys_element.upper()}\n\n')
for components in information:
file.write('-' * 50 + '\n')
for parameter, value in components.items():
if value:
file.write(f'{parameter.upper()} - {value}\n')
file.write('=' * 100)

Результат.

После запуска скрипта получим примерно такой результат:

ОПЕРАЦИОННАЯ СИСТЕМА

--------------------------------------------------
CAPTION - Майкрософт Windows 10 Pro
NAME - Майкрософт Windows 10 Pro|C:\Windows|\Device\Harddisk0\Partition3
MANUFACTURER - Microsoft Corporation
VERSION - 10.0.19045
OSARCHITECTURE - 64-разрядная
======================================================
МАТЕРИНСКАЯ ПЛАТА

--------------------------------------------------
CAPTION - Основная плата
NAME - Основная плата
MANUFACTURER - Micro-Star International Co., Ltd.
VERSION - 1.0
PRODUCT - Z590-A PRO (MS-7D09)
======================================================

БИОС

--------------------------------------------------
CAPTION - 1.10
NAME - 1.10
MANUFACTURER - American Megatrends International, LLC.
VERSION - ALASKA - 1072009
======================================================

и так далее...

Получилась, хоть и не большая, но вполне полезная "Пчелка".

Листинг программы.

from wmi import WMI
machine = WMI()
WMI_PROVIDERS = {'Операционная система':machine.Win32_OperatingSystem(),
'Материнская плата': machine.Win32_BaseBoard(),
'БИОС': machine.Win32_BIOS(),
'Процессор': machine.Win32_Processor(),
'Видеокарта': machine.Win32_VideoController(),
'ОЗУ': machine.Win32_PhysicalMemory(),
'ПЗУ': machine.Win32_DiskDrive(),
'Сетевая карта': machine.Win32_NetworkAdapter(),
'Звуковая карта': machine.Win32_SoundDevice()
}
PARAMETERS = ['Caption', 'Name', 'Manufacturer', 'Version', 'PhysicalAdapter', 'NumberOfCores', 'ThreadCount', 'ConfiguredClockSpeed', 'FormFactor', 'OSArchitecture', 'Size', 'Product']
def gather_information(providers: object, parameters=None) -> list:
"""
Метод принимает на вход список параметров и путь, где их искать.
Возвращает - список  словарей (компонент: параметр).
:param: providers: object WMI
:param: parameters: list()
:return: list()
"""
if parameters is None:
parameters = PARAMETERS
info_sheet = []
for provider in providers:
information = dict()
for param in parameters:
try:
information[param] = (provider.__getattr__(param))
# Отлавливаем исключения, которые возникают при
отсутствие параметра.
except AttributeError as error:
information[error.name] = None
# Здесь необходимо явно указать условие False, иначе python
воспримет 0 или None за ложь и пропустит некоторые
параметры.
if information.get('PhysicalAdapter') == False:
pass
# Переводим байты в гигабайты. Актуально для ПЗУ.
elif size := information.get('Size'):
information['Size'] = int(size) // 1024 ** 3
info_sheet.append(information)
else:
info_sheet.append(information)
return info_sheet
def save_to_a_file(sys_element: str, information: list, file: object) -> None:
"""
Метод принимает на вход имя системного элемента, словарь с
ифнмормацией о нем и объект контекстного менеджера. Проходя по всем
элементам словаря, в файл записывается вся полезная информаци.
:param: sys_element: str
:param: information: list()
:param: file: object()
:return: None
"""
file.write(f'\n{sys_element.upper()}\n\n')
for components in information:
file.write('-' * 50 + '\n')
for parameter, value in components.items():
if value:
file.write(f'{parameter.upper()} - {value}\n')
file.write('=' * 100)
def bee() -> None:
"""
Метод 'Пчела' реализует основную логику программы: сбор информации и
распечатка ее в файл.
:return: None
"""
path_file = 'system_info.txt'
with open(file=path_file, mode='w', encoding='UTF-8') as file:
for sys_element, providers in WMI_PROVIDERS.items():
information = gather_information(providers)
save_to_a_file(sys_element, information, file)
if __name__ == '__main__':
bee()