Python для начинающих
1.08K subscribers
304 photos
3 videos
232 files
62 links
Python для начинающих
Download Telegram
# Введение в библиотеку pywin32 для работы с Windows API

Если вы работаете с Python под Windows, рано или поздно вы столкнетесь с задачами, которые требуют глубокого погружения в операционную систему. Например, нужно автоматизировать взаимодействие с приложениями, управлять файлами на низком уровне или, например, получать системную информацию. И тут на помощь приходит мощная библиотека pywin32. Сегодня я расскажу, что это за инструмент, зачем он нужен и покажу несколько примеров его использования.

## Что такое pywin32?

pywin32 — это библиотека Python, которая предоставляет доступ ко всем красотам Windows API. С её помощью можно взаимодействовать с COM-объектами (например, управлять Excel или Word), работать с системными процессами, реестром, окнами и даже выполнять сложные операции, вроде настройки безопасности файлов и папок или работы с системным журналом событий.

Эта библиотека открывает перед разработчиками двери в мир низкоуровневых возможностей Windows, предлагая удобный интерфейс для выполнения задач, которые обычно требуют написания кода на C++ или других системных языках.

## Установка pywin32

Прежде чем окунёмся в примеры, давайте поставим библиотеку (если её ещё нет). Установить её проще простого через pip:

pip install pywin32


Теперь, когда библиотека установлена, перейдём к практике!

---

## Пример 1. Получение имени текущего пользователя

Работа с Windows API включает в себя то, что в других библиотеках кажется магией. Например, вот как с помощью pywin32 узнать имя текущего пользователя:

import win32api

# Получаем имя текущего пользователя
username = win32api.GetUserName()
print(f"Current user: {username}")


Этот код вызывает встроенную функцию Windows GetUserName и возвращает имя активно аутентифицированного пользователя. Просто и эффективно!

---

## Пример 2. Чтение системного реестра

Реестр Windows — это ключевая часть операционной системы, где хранятся настройки приложений и оборудования. Pywin32 позволяет легко читать и модифицировать его:

import winreg

# Открываем раздел реестра
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")

# Читаем значение ключа
product_name, _ = winreg.QueryValueEx(key, "ProductName")
print(f"Windows Edition: {product_name}")

# Закрываем ключ
winreg.CloseKey(key)


Здесь мы читаем информацию о версии Windows из реестра. Pywin32 использует модуль winreg, благодаря чему доступ к реестру становится максимально доступным и безопасным.

---

## Пример 3. Автоматизация приложений через COM

Один из самых мощных аспектов pywin32 — это интеграция с COM-объектами. Например, с помощью этой библиотеки можно управлять приложениями пакета Microsoft Office. Вот простой пример управления Excel:

import win32com.client

# Открываем Excel
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True

# Создаём новую книгу
workbook = excel.Workbooks.Add()

# Работаем с первым листом
sheet = workbook.Sheets(1)
sheet.Cells(1, 1).Value = "Hello, Excel!"

# Сохраняем файл
workbook.SaveAs(r"C:\example.xlsx")
excel.Quit()


Этот скрипт открывает Excel, создаёт новый файл, записывает текст в первую ячейку и сохраняет файл на диск. Всего несколько строк кода — и вы уже автоматизируете работу с офисными приложениями!

---

## Пример 4. Управление окнами и процессами

А как насчёт того, чтобы управлять окнами открытых приложений? Pywin32 позволяет это делать. Например, найдём окно блокнота и выведем его заголовок:

import win32gui

def enum_windows(hwnd, result):
if win32gui.IsWindowVisible(hwnd):
title = win32gui.GetWindowText(hwnd)
if "Notepad" in title:
print(f"Found Notepad window: {title}")

# Перебираем все окна
win32gui.EnumWindows(enum_windows, None)


Этот скрипт ищет открытое окно блокнота и выводит информацию о нём.
👍2
Вы можете использовать эту возможность для автоматизации взаимодействий с любыми приложениями.

---

## Итоги

Библиотека pywin32 — это мощный инструмент, позволяющий разрабатывать приложения, глубоко интегрированные с Windows. Управление окнами, процессами, работа с реестром и системными службами — всё это становится возможным с помощью нескольких строк кода на Python.

Этот инструмент может стать незаменимым, если вы разрабатываете системные утилиты, автоматизируете рутинные задачи или просто хотите лучше понять, как работает операционная система изнутри. Так что, если вы ещё не пробовали pywin32, самое время начать!
👍1
- Использование ctypes для взаимодействия с C-библиотеками в Python.
👍1
- Использование ctypes для взаимодействия с C-библиотеками в Python.
👍1
#### Использование ctypes для взаимодействия с C-библиотеками в Python

Когда дело доходит до Python, у многих из нас есть заветная мечта: как бы исполнить этот удобный, высокоуровневый код, но с мощью и скоростью C? Ответ прост: библиотека ctypes. Этот встроенный модуль позволяет Python напрямую взаимодействовать с библиотеками, написанными на C, открывая двери к производительности и эффективности.

### Зачем вообще нужен ctypes?
Иногда бывает, что библиотека или модуль, реализованные на Python, работают слишком медленно для задач, требующих высокой производительности. Вместо того чтобы переписывать код на C или грузить проект сложными интерфейсами вроде Cython или SWIG, можно просто использовать уже существующую C-библиотеку через ctypes. Это особенно полезно, когда вы хотите обернуть существующий C-код в Python, чтобы использовать его напрямую.

### Как это работает?
ctypes позволяет Python вызывать функции из динамических библиотек (.dll, .so, .dylib) и работать с типами данных, используемыми в C. С его помощью вы создаёте мост между мирами Python и C.

Теперь давайте разберём всё на примере. Мы создадим небольшую C-функцию, которая выполняет простую математическую операцию, и вызовем её из Python.

---

### Шаг 1: Создайте библиотеку на C
Первым делом нам понадобится динамическая библиотека. Вот пример кода на C:

// calc.c
#include <stdio.h>

int add_numbers(int a, int b) {
return a + b;
}


Скомпилируйте этот код в динамическую библиотеку. Например, на Linux это можно сделать так:

gcc -shared -o libcalc.so -fPIC calc.c


Теперь у нас есть файл libcalc.so, который мы будем подключать к Python.

---

### Шаг 2: Используем ctypes в Python
Теперь откроем библиотеку в нашем Python-коде и вызовем функцию add_numbers. Вот пример:

import ctypes

# Подгружаем нашу библиотеку
lib = ctypes.CDLL('./libcalc.so')

# Задаём прототип функции add_numbers
lib.add_numbers.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add_numbers.restype = ctypes.c_int

# Вызываем функцию
result = lib.add_numbers(5, 7)
print(f"Result: {result}")


Тут мы сделали несколько важных вещей:
1. Подключили библиотеку через ctypes.CDLL.
2. Указали Python, какие типы аргументов принимает функция (ctypes.c_int соответствует int в C).
3. Описали тип возвращаемого значения функции (restype).
4. Вызвали функцию и получили результат.

Консоль выдаст:
Result: 12


Просто! Теперь Python легко и быстро взаимодействует с C-библиотекой.

---

### Работа с указателями и массивами
А теперь давайте что-нибудь посложнее. Например, передадим из Python массив C-функции и сделаем простую операцию с его элементами.

Допустим, у нас такой код на C:

// array_sum.c
#include <stddef.h>

int sum_array(int *arr, size_t n) {
int sum = 0;
for (size_t i = 0; i < n; i++) {
sum += arr[i];
}
return sum;
}


Собираем библиотеку:
gcc -shared -o libarray.so -fPIC array_sum.c


Python-код для вызова этой функции:

import ctypes

# Подгружаем библиотеку
lib = ctypes.CDLL('./libarray.so')

# Задаём прототип функции sum_array
lib.sum_array.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.c_size_t]
lib.sum_array.restype = ctypes.c_int

# Создаём массив
arr = (ctypes.c_int * 5)(1, 2, 3, 4, 5)

# Передаём массив в функцию
result = lib.sum_array(arr, len(arr))
print(f"Sum of array: {result}")


Вывод:
Sum of array: 15


---

### Преимущества использования ctypes
1. Минимальные зависимости: модуль встроен в стандартную библиотеку Python.
2. Гибкость: можно взаимодействовать с любыми C-библиотеками без необходимости их модификации.
3. Простота: писать код на Python всегда легче, чем напрямую на C.

### Недостатки
Но есть и минусы.
👍1
Например:
- Опасность неверной работы с указателями, что может привести к падению программы.
- Производительность немного ниже, чем в чистом C-коде, из-за необходимости преобразования типов данных.

---

### Заключение
ctypes — это мощный инструмент, который открывает широчайшие возможности Python. С его помощью вы можете пользоваться проверенным временем C-кодом, расширяя свои проекты за пределы Python. И самое главное: вам не нужен глубокий опыт в C, чтобы начать взаимодействовать с его библиотеками. Попробуйте, и вы удивитесь, как многое можно сделать буквально за несколько строк кода!
👍2
- Как использовать модуль difflib для сравнения строк и файлов.
# Как использовать модуль difflib для сравнения строк и файлов

Привет, друзья! Сегодня мы погружаемся в достаточно интересную и полезную тему: сравниваем строки и даже целые файлы с помощью встроенного модуля Python — difflib. Этот модуль иногда недооценивают, а между тем, он способен серьезно упростить жизнь, если вам нужно анализировать различия в текстовых данных, такие как изменения в коде, документах или конфигурационных файлах.

Давайте посмотрим, какие у него возможности и как его использовать на практике!

---

### Чем полезен difflib?

difflib — это универсальный инструмент для работы с текстовыми различиями. Его основная цель — показать пользователю, где именно строки или файлы отличаются друг от друга. С его помощью вы можете:
- Сравнить строки построчно.
- Найти участки текста, которые отличаются.
- Построить читаемое описание различий (например, в формате, похожем на diff из Linux).
- Рассчитать степень схожести строк.

Теперь к делу!

---

### Быстрый старт: SequenceMatcher

Начнем с простого: сравним две строки. Для этого используем класс SequenceMatcher.

from difflib import SequenceMatcher

text1 = "Python is awesome!"
text2 = "Python is super awesome!"

matcher = SequenceMatcher(None, text1, text2)
similarity = matcher.ratio()
print(f"Similarity: {similarity:.2f}")


Здесь SequenceMatcher возвращает степень схожести строк в виде числа от 0 до 1. Правильный результат зависит от того, насколько тексты похожи; например, выше код выведет:

Similarity: 0.84


— что значит, что строки примерно на 84% похожи.

Если нужно найти конкретные изменения, можно перебрать их через метод .get_opcodes(). Он возвращает список операций, таких как replace, delete, insert, и их позицию в строке. Пример:

for tag, i1, i2, j1, j2 in matcher.get_opcodes():
print(f"{tag}: text1[{i1}:{i2}] -> text2[{j1}:{j2}]")


---

### Сравнение двух файлов: unified_diff

Теперь представьте, что нам нужно сравнить не строки, а содержимое двух текстовых файлов. Это реально сделать также с помощью модуля difflib. В этом случае используется функция unified_diff, которая, на удивление, создаёт человечески читаемые различия.

Пример кода:

from difflib import unified_diff

# Читаем содержимое двух файлов
with open('file1.txt') as f1, open('file2.txt') as f2:
lines1 = f1.readlines()
lines2 = f2.readlines()

# Создаем diff
diff = unified_diff(lines1, lines2, lineterm='', fromfile='file1.txt', tofile='file2.txt')

# Печатаем результат
for line in diff:
print(line)


Результат этого кода покажет вам, какие строки были добавлены, какие удалены, а какие — модифицированы. Например:

--- file1.txt
+++ file2.txt
@@ -1,3 +1,3 @@
-Line 1
-Old line 2
+New line 2
Line 3


Это уже выглядит знакомо, если вы хоть раз пользовались системой контроля версий вроде Git.

---

### HtmlDiff для красивой визуализации

Если сухие текстовые различия вас не устраивают, difflib предлагает инструмент для создания HTML-файла с визуальным представлением изменений. Этот инструмент называется HtmlDiff.

Пример использования:

from difflib import HtmlDiff

text1 = ["This is line 1.", "This is line 2.", "This is the final line."]
text2 = ["This is line 1.", "This line is changed.", "This is the final line."]

html_diff = HtmlDiff().make_file(text1, text2, fromdesc='File 1', todesc='File 2')

# Сохраняем результат в файл
with open('diff.html', 'w') as f:
f.write(html_diff)


Созданный файл diff.html можно открыть в браузере, и он покажет строки, которые были добавлены, изменены или удалены, с удобным форматированием и подсветкой.

---

### Где это можно применить?

1. Контроль версий файлов — если вы хотите сравнить разные версии текста или конфигурации.
2. Обработка текстовых данных — модуль помогает найти различия в базах данных, логах или пользовательских вводах.
3.
Инструменты для анализа кода — HtmlDiff может стать основой визуального представления различий в небольших проектах.

---

### Заключение

difflib — это мощный инструмент, который прост в использовании и способен решить уйму задач, связанных с анализом текста. От проверок схожести строк до построения наглядных diff'ов для файлов — он позволяет сосредоточиться на логике, минимизируя рутину. Так что, если возникнет вопрос “в чём файлы отличаются?” — теперь вы знаете, куда обращаться.

Итак, экспериментируйте, пытайтесь, создавайте — Python даёт все возможности! 🚀
👍3
- Создание парсеров для командной строки с помощью модуль click.
### Создание парсеров для командной строки с помощью модуля click

В мире Python есть разнообразные инструменты для создания утилит командной строки. Кто-то обожает библиотеку argparse, а кто-то выбирает сторонние решения вроде typer или docopt. Сегодня мы поговорим о звезде в этой коллекции – библиотеке click. Простая, лаконичная, интуитивно понятная – click помогает создавать мощные CLI-приложения легко и непринужденно. Разберём, как работает модуль, и создадим несколько простых утилит для вас.

Итак, что же такое click? На самом деле, название произошло от слова Command Line Interface Creation Kit (инструментарий для создания CLI). Эта библиотека предназначена для парсинга командной строки и предоставляет гибкий, но при этом удобный API.

---

#### Установка click

Для начала установим библиотеку. Если она у вас ещё не установлена, выполните команду:

pip install click


---

#### Первый скрипт: приветственное сообщение

Давайте для начала создадим утилиту, которая будет приветствовать пользователя. Вот пример кода:

import click

@click.command()
@click.argument("name")
def greet(name):
"""Простая программа для приветствия пользователя."""
click.echo(f"Hello, {name}!")

if __name__ == "__main__":
greet()


Рассмотрим, что здесь происходит. С помощью декоратора @click.command мы указываем, что функция greet является командой CLI. Декоратор @click.argument позволяет добавить аргумент, передаваемый через командную строку (в данном случае name).

Когда мы запускаем скрипт в терминале, передав имя:

python script.py Alice


Получаем результат:

Hello, Alice!


Просто, правда?

---

#### Обработка опций

Теперь давайте добавим к нашей программе опции. Как насчёт возможности задать язык приветствия? Для этого используется декоратор @click.option:

import click

@click.command()
@click.option("--lang", default="en", help="Set language (en, ru or es).")
@click.argument("name")
def greet(lang, name):
"""Программа для приветствия пользователя на разных языках."""
greetings = {
"en": "Hello",
"ru": "Привет",
"es": "Hola"
}
greeting = greetings.get(lang, "Hello")
click.echo(f"{greeting}, {name}!")

if __name__ == "__main__":
greet()


Теперь попробуем передать параметр для выбора языка:

python script.py Alice --lang ru


Вывод:

Привет, Alice!


Здесь опция --lang задаёт язык приветствия. Значение по умолчанию – английский.

---

#### Несколько команд

Иногда в приложении нужен доступ сразу к нескольким командам. Например, одна команда могла бы вычислять сумму чисел, а другая – приветствовать пользователя. В этом случае нам поможет @click.group.

Вот пример:

import click

@click.group()
def cli():
"""Группа команд."""
pass

@cli.command()
@click.argument("a", type=int)
@click.argument("b", type=int)
def add(a, b):
"""Суммирует два числа."""
click.echo(f"The sum is: {a + b}")

@cli.command()
@click.argument("name")
def greet(name):
"""Приветствует пользователя."""
click.echo(f"Hi, {name}!")

if __name__ == "__main__":
cli()


Теперь мы получаем приложение с двумя командами: add (сложение) и greet (приветствие). Используем их так:

python script.py add 5 7


Вывод:

The sum is: 12


Или:

python script.py greet Bob


Вывод:

Hi, Bob!


---

#### Продвинутое использование

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

import click

@click.command()
@click.option("--delete", is_flag=True, help="Delete the file.")
def manage_file(delete):
"""Управление файлом."""
if delete:
if click.confirm("Are you sure you want to delete the file?"):
click.echo("File deleted.")
else:
click.echo("Operation cancelled.")
else:
click.echo("No action taken.")

if __name__ == "__main__":
manage_file()


---

#### Почему click?

Вот несколько причин, почему стоит использовать click:

1. Простота и читаемость кода. Всё настраивается через декораторы. Код остаётся чистым и понятным.
2. Богатый функционал. Аргументы, опции, группы команд, валидация данных – всё на месте.
3. Эффективность. click абстрагирует многие тонкости, связанные с парсингом командной строки.
4. Интерактивные возможности. Встроенные функции для подтверждения действий или цветного вывода в терминал.

---

Теперь вы знаете, как легко создавать утилиты для командной строки с помощью click. Это мощный инструмент, который существенно упрощает жизнь программиста. Попробуйте воплотить свои идеи, и пусть ваши небольшие CLI-приложения делают мир чуточку удобнее! 🚀
2
- Работа с заголовками HTTP-запросов и куки с библиотекой requests.
- Работа с заголовками HTTP-запросов и куки с библиотекой requests.
Работа с заголовками HTTP-запросов и куки с библиотекой requests

Привет! Сегодня мы поговорим про одну из самых популярных библиотек для выполнения HTTP-запросов на Python — requests. Если вы только начинаете изучать создание запросов в интернете или хотите понять, как работают заголовки и куки в этом процессе, то этот пост именно для вас. Мы разберём всё на практических примерах и узнаем, как легко можно управлять HTTP-запросами.

### Почему заголовки и куки важны?

Когда вы отправляете HTTP-запрос, такие аспекты, как заголовки (headers) и куки (cookies), играют ключевую роль. Заголовки позволяют передавать дополнительную информацию о запросе, например, указание формата данных, имени клиента (например, браузера) или токенов авторизации. А вот куки — это данные, которые сервер передаёт клиенту (вашему приложению) для хранения состояния — сессий, пользовательских настроек и прочего.

Что это значит на практике? Например:
- Заголовок User-Agent имитирует работу реального браузера.
- Куки помогают сохранять авторизацию пользователя или параметры его сеанса на сервере.

Теперь давайте перейдём к практике.

### Работа с заголовками

Чтобы добавить заголовки в запрос, используем параметр headers, который передаётся в методах requests.get(), requests.post() и других. Пример:

import requests

url = "https://httpbin.org/headers" # Этот сайт покажет нам, какие заголовки мы отправили

headers = {
"User-Agent": "Awesome-Python-App/1.0",
"Accept": "application/json"
}

response = requests.get(url, headers=headers)
print(response.json())


Здесь мы отправили заголовки User-Agent (идентификация нашего клиента) и Accept (формат данных, который мы хотим получить). Выполнив этот пример, вы увидите, что сервер принял и отобразил наши заголовки.

### Работа с куки

Куки — это способ сохранить информацию между запросами. Например, сервер может вернуть "сессионную" куки, которая используется для идентификации клиента при каждом запросе. Работа с куки в requests невероятно проста!

Предположим, мы выполняем POST-запрос, который возвращает нам куки. Воспользуемся библиотекой для отправки запроса и работы с ними:

# Пример посылает POST-запрос и получает куки от сервера
url = "https://httpbin.org/cookies/set"

# Отправляем куки 'session_id'
response = requests.post(url, cookies={"session_id": "12345"})
print("Отправленные куки:", response.request.headers.get("Cookie"))

# Теперь проверим, какие куки получили
cookies_url = "https://httpbin.org/cookies"
response = requests.get(cookies_url, cookies=response.cookies)
print("Принятые куки:", response.json())


В этом примере мы сначала "устанавливаем" куки на сервере, а затем запрашиваем их обратно. Это наглядно демонстрирует, как сервер и клиент могут обмениваться данными через куки.

### Комбинируем заголовки и куки

Теперь давайте объединим работу с заголовками и куки для интересного случая: аутентификация. Например, сделаем вид, что авторизуемся с токеном:

url = "https://httpbin.org/headers"

headers = {
"Authorization": "Bearer my_secret_token",
"User-Agent": "PythonHttpClient/2.0"
}

cookies = {
"session_id": "abc123",
"theme": "dark"
}

response = requests.get(url, headers=headers, cookies=cookies)
print(response.json())


Наш запрос содержит и заголовки (для передачи токена и имени клиента), и куки (сессию и настройки).

### Полезно знать

- Если вы хотите сохранить состояние между запросами (и повторно использовать куки), используйте объект requests.Session().
Он автоматически передаёт куки из одного запроса в другой:
  s = requests.Session()
s.headers.update({"User-Agent": "MyApp/1.0"})

# Выполняем запрос, сессионные куки сохранятся
s.get("https://httpbin.org/cookies/set?test_cookie=value")

# Сохранившиеся куки автоматически используются
r = s.get("https://httpbin.org/cookies")
print(r.json())


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

### Итоги

Теперь вы знаете, как работать с заголовками и куки с использованием библиотеки requests. Это полезный скилл для работы с API, авторизацией и создания полноценных HTTP-клиентов. Не забывайте проверять документацию — она станет вашим лучшим другом во время изучения новых возможностей этой библиотеки.

А на сегодня всё! Оставайтесь на связи, экспериментируйте и не переставайте учиться. 🚀
👍2
- Создание и управление виртуальными машинами с использованием libvirt.
# Создание и управление виртуальными машинами с использованием libvirt в Python

Работать с виртуальными машинами в 2023 году? Легко! Неужели вам никогда не хотелось «подружить» Python с виртуальными средами? Если вы программист на Python, и вас интересует автоматизация управления виртуальными машинами, то библиотека libvirt — именно то, что нужно! Сегодня я расскажу, как работать с этой библиотекой, разберем основные принципы и рассмотрим конкретные примеры.

## Что такое libvirt?
libvirt — это набор инструментов и API для управления гипервизорами, виртуальными машинами (VM) и контейнерами. В рамках Python есть модуль libvirt, который позволяет взаимодействовать с разными гипервизорами (KVM, QEMU, Xen и др.), создавая мощные скрипты для автоматизации работы с виртуализацией.

Готовы? Тогда подключайте ремни безопасности: сейчас мы отправимся в мир управления виртуальными машинами!

---

## Как установить libvirt?
Для начала убедитесь, что библиотека libvirt установлена на вашей системе. В ОС на базе Linux часто уже предустановлены базовые инструменты для работы с виртуализацией.

Установить клиент для Python можно через pip:
  
pip install libvirt-python


Также убедитесь, что у вас есть гипервизор, например, QEMU или KVM.

---

## Подключение к гипервизору
Первое, что нужно сделать, это подключиться к гипервизору. В контексте libvirt это называется подключением к "хосту".

Пример:
  
import libvirt

# Подключение к локальному гипервизору
conn = libvirt.open('qemu:///system')

if conn is None:
print("Failed to connect to the hypervisor")
else:
print("Connected to the hypervisor!")
conn.close()

Обратите внимание, что qemu:///system — это URI подключения к гипервизору QEMU/KVM. Если вы работаете с другим гипервизором, его URI может отличаться (например, Xen использует xen:///).

---

## Создание виртуальной машины
Теперь давайте рассмотрим, как можно создать виртуальную машину. Для этого нам потребуется XML-конфигурация, описывающая свойства будущей VM (например, образ диска, память, процессоры).

Пример XML:
  
<domain type='kvm'>
<name>DemoVM</name>
<memory unit='KiB'>1048576</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/demo.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<source network='default'/>
</interface>
</devices>
</domain>


Как загрузить это XML через Python?

  
with open('vm_config.xml', 'r') as f:
xml_config = f.read()

vm = conn.createXML(xml_config, 0)
if vm is None:
print("Failed to create a VM.")
else:
print(f"VM {vm.name()} created successfully!")


Файл XML можно подготовить заранее, а в Python лишь передать его в библиотеку. За вас libvirt выполнит все magic-манипуляции.

---

## Управление виртуальными машинами
Управление виртуальными машинами — также довольно простая задача. Вот несколько базовых операций:

- Список запущенных VM:
  
domains = conn.listAllDomains()
for dom in domains:
print(f"VM: {dom.name()}, is running: {dom.isActive()}")


- Остановка VM:
  
vm = conn.lookupByName('DemoVM')
vm.shutdown()


- Удаление VM (с конфигурацией):
  
vm.undefine()


Эти команды позволяют легко управлять состояниям виртуальных машин, будь то запущенные экземпляры или остановленные.

---

## Выводы
Библиотека libvirt открывает огромные возможности для управления виртуальными машинами.
От простых операций вроде запуска и остановки до настоящей магии автоматизации, такой как программное создание VM с конкретными конфигурациями.

Да, работа с libvirt требует некоторого изучения XML-описаний и особенностей гипервизеров, но результат оправдывает усилия. Вы можете автоматизировать создание, управление и удаление виртуальных серверов, подготовить тестовые среды — и всё это в несколько строчек кода на Python.

Если пока не знакомы с виртуализацией, начните с установки гипервизора (например, QEMU/KVM на Linux) и изучения нескольких примеров. Вперед за новыми знаниями!
🔥4
- Как использовать библиотеку faker для генерации фиктивных данных.