Версия Python 3.11.9 - https://www.python.org/downloads/
Проект https://cloud.mail.ru/public/zq5N/P8EE93umK
Проект - "ПЧЕЛА"
"Пчёлы — полезные насекомые: они дарят целебные и уникальные по своему составу продукты, такие как мёд, пергу, маточное молочко, прополис, воск, а также опыляют растения (Яндекс)." - прочитал я и решил, что и мне не помешают полезные помощники, которые бы, например, собрали информацию о моей системе и железе.
Запустив руки в интернет удалось выяснить, что для операционной системы Windows существует WMI API, который предоставляет относительно удобный доступ к нужной мне информации.
Задачи.
Необходимо найти и записать следующую информацию в файл:
- Наименование и версия операционной системы
- Наименование материнской платы
- Наименование процессора, количество ядер и потоков
- Наименование видеокарты
- Наименование ОЗУ, его объем и частоту
- Наименование ПЗУ, его объем
- Наименование сетевой и звуковой карты
Приступим.
Первым делом создаем README.mk где подробно напишем чем занимается наша программа и как ее зовут.
Затем, командой pip install WMI, подтягиваем последнюю версию библиотеки WMI и создаем requirements.txt (pip freeze > requirements.txt).
Импортируем библиотеку и создаем две константы:
- machine - объект класса WMI
- WMI_PROVIDERS - словарь хранит наименование компонента и "путь", где можно найти информацию о нем
- 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()