Средства взаимодействия Python с операционной системой Windows

Раздел: Основы Python -> Работа с модулями

Модули Windows для Python: обзор возможностей

Как наиболее эффективно выполнять команды Windows и получать результат из Python?

Основное решение: модуль subprocess с использованием subprocess.run()

Этот метод обеспечивает полный контроль над процессом, позволяет захватывать вывод и обрабатывать ошибки. Подходит для выполнения любых консольных команд Windows, таких как dir, ipconfig, ping и т.д.

Пример: выполнить команду ipconfig и вывести результат.


import subprocess
result = subprocess.run(['ipconfig'], capture_output=True, text=True, encoding='cp866')
print(result.stdout)
  

Python module attributes (атрибуты модуля в python)

Настройка протокола IP для Windows

Адаптер Ethernet Ethernet0:...

Python module version (версия модуля python)

Пояснение шагов:

  • capture_output=True - захватывает stdout и stderr.
  • text=True - возвращает строковый вывод (иначе байты).
  • encoding='cp866' - указывает кодировку консоли Windows для корректного отображения кириллицы.

Типичная проблема:

Если не указать encoding, в выводе могут появиться кракозябры (вместо русских букв). Для Windows 10+ часто нужна cp1251 или utf-8 (зависит от настроек).

Также при запуске программ с GUI (notepad) параметр capture_output может привести к зависанию, если программа остается открытой.

Цель: автоматизация команд администратора, сбор информации о системе, управление службами.

Вариант 1. Как запустить команду без захвата вывода?

Использование os.system() - простейший способ, но вывод отправляется прямо в консоль и его нельзя сохранить.

import os; os.system('echo Привет')

Python cpp module (взаимодействие python с модулями c++)

Привет

Python module cv2 (модуль cv2 (opencv) в python)

Недостаток: нет контроля над процессом. Подходит только для быстрых команд, где вывод не важен.

Ошибка: код возврата не всегда отражает успех - при запуске сторонних программ может вернуть 0, даже если они завершились с ошибкой.

Вариант 2. Как получить вывод в реальном времени?

subprocess.Popen с потоками - позволяет читать stdout построчно.


import subprocess
proc = subprocess.Popen(['ping', '8.8.8.8'], stdout=subprocess.PIPE, text=True, encoding='cp866')
for line in proc.stdout:
    print(line.strip())
  

Python encodings module (модуль encodings в python)

Обмен пакетами с 8.8.8.8 по с...

Platform module python (модуль platform в python)

Пояснение: stdout=subprocess.PIPE создаёт поток, который можно читать итеративно. Полезно для длительных процессов (например, мониторинг пинга).

Проблема: при большом объёме вывода может произойти взаимоблокировка, если не читать своевременно.

Вариант 3. Как вызывать WinAPI функции напрямую?

Модуль ctypes позволяет обращаться к библиотекам Windows (user32, kernel32). Например, получить версию системы.


import ctypes
kernel32 = ctypes.windll.kernel32
GetVersionEx = kernel32.GetVersionExW
# Определение структуры OSVERSIONINFOW
class OSVERSIONINFOW(ctypes.Structure):
    _fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
                ('dwMajorVersion', ctypes.c_ulong),
                ('dwMinorVersion', ctypes.c_ulong),
                ('dwBuildNumber', ctypes.c_ulong),
                ('dwPlatformId', ctypes.c_ulong),
                ('szCSDVersion', ctypes.c_wchar * 128)]
ver = OSVERSIONINFOW()
ver.dwOSVersionInfoSize = ctypes.sizeof(ver)
GetVersionEx(ctypes.byref(ver))
print(f'{ver.dwMajorVersion}.{ver.dwMinorVersion}.{ver.dwBuildNumber}')
  

Python string module (модуль string в python)

10.0.19045

Module sys python (модуль sys в python)

Подходит для низкоуровневых операций, когда стандартных средств недостаточно. Требует знания структур Windows API.

Ошибка: неверное определение структуры может привести к аварийному завершению Python (Access Violation).

Вариант 4. Как работать с COM-объектами Windows?

Библиотека pywin32 (win32com.client) позволяет автоматизировать Excel, Word, Internet Explorer и другие приложения через COM. Например, открыть Excel и прочитать ячейку.


import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = True  # показать Excel
wb = excel.Workbooks.Open(r'C:\test.xlsx')
sheet = wb.Sheets(1)
value = sheet.Cells(1,1).Value
print(value)
excel.Quit()
  

Python tkinter module (модуль tkinter в python)

42

Python types module (модуль types в python)

Пояснение: Dispatch создаёт экземпляр COM-объекта. Требуется установленная программа (Excel) и библиотека pywin32.

Проблема: если Excel не установлен, возникнет com_error. Также при ошибке Excel может остаться в памяти - следует обернуть в try/finally с вызовом Quit().

Вариант 5. Как получать информацию через WMI?

Модуль wmi (обёртка над WQL) - удобно для системных данных (процессоры, диски, процессы).


import wmi
c = wmi.WMI()
for proc in c.Win32_Process():
    print(proc.Name, proc.ProcessId)
  

Python typing module (модуль typing в python)

svchost.exe 1234
notepad.exe 5678...

Python module windows (модуль windows для python)

Цель: мониторинг системы, управление процессами, получение аппаратных характеристик.

Ошибка: запрос может потребовать прав администратора для некоторых классов (например, Win32_Service).

Вариант 6. Как управлять реестром Windows?

Встроенный модуль winreg (или _winreg для старых версий) - чтение и запись ключей реестра.


import winreg
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion')
value, _ = winreg.QueryValueEx(key, 'ProgramFilesDir')
print(value)
winreg.CloseKey(key)
  

Python module path (путь к модулю python)

C:\Program Files

Пояснение: открытие ключа, чтение значения, закрытие. Поддержка 32/64-разрядных реестров через KEY_WOW64_64KEY.

Ошибка: отсутствие прав доступа приведёт к PermissionError. Для записи требуется администратор.

Расширенные примеры использования модулей Windows

Пример 1. Мониторинг запущенных процессов через WMI с фильтрацией

Пример

import wmi
def get_processes_by_memory(min_mb=100):
    c = wmi.WMI()
    processes = []
    for proc in c.Win32_Process():
        try:
            mem = int(proc.WorkingSetSize) / 1024  # байты в КБ
            if mem > min_mb * 1024:
                processes.append((proc.Name, proc.ProcessId, mem))
        except:
            continue
    return processes

for name, pid, mem in get_processes_by_memory(200):
    print(f'{name} (PID {pid}): {mem:.0f} KB')
chrome.exe (PID 1234): 450000 KB
python.exe (PID 5678): 320000 KB

Пояснение: запрос WMI возвращает объекты с атрибутами. WorkingSetSize - физическая память. Фильтрация позволяет быстро найти самые «тяжёлые» процессы.

Пример 2. Запись значения в реестр для автозагрузки

Пример

import winreg
key_path = r'Software\Microsoft\Windows\CurrentVersion\Run'
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_SET_VALUE)
winreg.SetValueEx(key, 'MyApp', 0, winreg.REG_SZ, r'C:\myapp.exe')
winreg.CloseKey(key)
print('Ключ добавлен')
Ключ добавлен

Пояснение: открытие ветки HKEY_CURRENT_USER (не требует прав администратора) с доступом на запись. SetValueEx создаёт строковое значение. Для 64-битных систем может потребоваться флаг доступа winreg.KEY_WOW64_64KEY.

Типичная ошибка: если ключ уже существует без прав на запись, возникает PermissionError. Рекомендуется использовать CreateKeyEx с попыткой обновления.

Пример 3. Автоматизация Excel через COM с созданием графика

Пример

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Add()
sheet = wb.Sheets(1)
# Заполняем данные
for i in range(1, 6):
    sheet.Cells(i, 1).Value = i
    sheet.Cells(i, 2).Value = i**2
# Создаём график
chart = wb.Charts.Add()
chart.SetSourceData(sheet.Range(sheet.Cells(1,1), sheet.Cells(5,2)))
chart.ChartType = -4169  # xlXYScatter
chart.ApplyLayout(1)
wb.SaveAs(r'C:\graph.xlsx')
excel.Quit()
(файл graph.xlsx создан)

Пояснение: gencache.EnsureDispatch генерирует и кэширует оболочку для Excel, что ускоряет последующие вызовы. ChartType коды можно найти в документации. Важно закрыть Excel, чтобы не оставлять висящий процесс.

Пример 4. Получение системной информации с помощью ctypes (GetSystemInfo)

Пример

import ctypes
class SYSTEM_INFO(ctypes.Structure):
    _fields_ = [
        ('wProcessorArchitecture', ctypes.c_uint16),
        ('wReserved', ctypes.c_uint16),
        ('dwPageSize', ctypes.c_ulong),
        ('lpMinimumApplicationAddress', ctypes.c_void_p),
        ('lpMaximumApplicationAddress', ctypes.c_void_p),
        ('dwActiveProcessorMask', ctypes.c_ulong),
        ('dwNumberOfProcessors', ctypes.c_ulong),
        ('dwProcessorType', ctypes.c_ulong),
        ('dwAllocationGranularity', ctypes.c_ulong),
        ('wProcessorLevel', ctypes.c_uint16),
        ('wProcessorRevision', ctypes.c_uint16)
    ]

info = SYSTEM_INFO()
kernel32 = ctypes.windll.kernel32
kernel32.GetSystemInfo(ctypes.byref(info))
print('Число процессоров:', info.dwNumberOfProcessors)
print('Архитектура:', info.wProcessorArchitecture)  # 0=x86, 9=x64, etc.
Число процессоров: 8
Архитектура: 9

Пояснение: структура SYSTEM_INFO определена в Windows API. Вызов GetSystemInfo заполняет её поля. Позволяет узнать аппаратные параметры низкоуровнево.

Пример 5. Управление службами через subprocess и sc

Пример

import subprocess
def get_service_status(service_name):
    cmd = ['sc', 'query', service_name]
    result = subprocess.run(cmd, capture_output=True, text=True, encoding='cp866')
    if result.returncode == 0:
        for line in result.stdout.split('\n'):
            if 'STATE' in line:
                return line.strip()
    return None

print(get_service_status('Spooler'))
STATE : 4  RUNNING

Пояснение: утилита sc работает в консоли Windows. Парсинг вывода позволяет получить информацию. Для изменения состояния (stop/start) потребуются права администратора и дополнительные параметры stop/start.

Модуль Windows для Python - comments

En
Python module windows (python)