> **Источник:** https://python-all.ru/3.1/library/msilib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 32.1. `msilib` – Чтение и запись файлов Microsoft Installer

*Платформы:* Windows

Модуль `msilib` поддерживает создание файлов Microsoft Installer (`.msi`). Поскольку такие файлы часто содержат встроенный «кабинетный» файл (`.cab`), он также предоставляет API для создания CAB-файлов. Поддержка чтения файлов `.cab` в настоящее время не реализована; чтение базы данных `.msi` возможно.

Этот пакет предоставляет полный доступ ко всем таблицам в файле `.msi`, поэтому он является довольно низкоуровневым API. Два основных применения этого пакета – команда [`distutils`](https://python-all.ru/3.1/library/distutils.html#module-distutils) `bdist_msi` и создание самого установочного пакета Python (хотя в настоящее время для этого используется другая версия `msilib`).

Содержимое пакета можно условно разделить на четыре части: низкоуровневые процедуры CAB, низкоуровневые процедуры MSI, высокоуровневые процедуры MSI и стандартные структуры таблиц.

#### `msilib.FCICreate(cabname, files)`

Создаёт новый CAB-файл с именем *cabname*. *files* должен быть списком кортежей, каждый из которых содержит имя файла на диске и имя файла внутри CAB-файла.

Файлы добавляются в CAB-файл в том порядке, в котором они указаны в списке. Все файлы добавляются в один CAB-файл с использованием алгоритма сжатия MSZIP.

Колбэки в Python для различных этапов создания MSI в настоящее время не предоставлены.

#### `msilib.UuidCreate()`

Возвращает строковое представление нового уникального идентификатора. Эта функция оборачивает вызовы Windows API

`UuidCreate()`

и

`UuidToString()`

.

#### `msilib.OpenDatabase(path, persist)`

Возвращает новый объект базы данных вызовом MsiOpenDatabase.

*path*

– имя файла MSI;

*persist*

может быть одной из констант

`MSIDBOPEN_CREATEDIRECT`

,

`MSIDBOPEN_CREATE`

,

`MSIDBOPEN_DIRECT`

,

`MSIDBOPEN_READONLY`

или

`MSIDBOPEN_TRANSACT`

, и может включать флаг

`MSIDBOPEN_PATCHFILE`

. Смотрите документацию Microsoft для описания этих флагов; в зависимости от флагов открывается существующая база данных или создаётся новая.

#### `msilib.CreateRecord(count)`

Возвращает новый объект записи вызовом

`MSICreateRecord()`

.

*count*

– количество полей записи.

#### `msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)`

Создаёт и возвращает новую базу данных *name*, инициализирует её схемой *schema* и задаёт свойства *ProductName*, *ProductCode*, *ProductVersion* и *Manufacturer*.

*schema* должен быть объектом модуля, содержащим атрибуты `tables` и `_Validation_records`; обычно следует использовать `msilib.schema`.

База данных будет содержать только схему и записи проверки, когда эта функция завершится.

#### `msilib.add_data(database, table, records)`

Добавляет все *records* в таблицу с именем *table* в *database*.

Аргумент *table* должен быть одной из предопределённых таблиц в схеме MSI, например `'Feature'`, `'File'`, `'Component'`, `'Dialog'`, `'Control'` и т.д.

*records* должен быть списком кортежей, каждый из которых содержит все поля записи в соответствии со схемой таблицы. Для необязательных полей можно передать `None`.

Значения полей могут быть целыми числами (int или long), строками или экземплярами класса Binary.

#### `class msilib.Binary(filename)`

Представляет записи в таблице Binary; вставка такого объекта через

[`add_data()`](https://python-all.ru/3.1/library/msilib.html#msilib.add_data)

считывает файл с именем

*filename*

в таблицу.

#### `msilib.add_tables(database, module)`

Добавляет всё содержимое таблиц из *module* в *database*. *module* должен содержать атрибут *tables*, перечисляющий все таблицы, для которых должно быть добавлено содержимое, и по одному атрибуту на каждую таблицу, содержащему фактические данные.

Обычно используется для установки таблиц последовательности.

#### `msilib.add_stream(database, name, path)`

Добавляет файл

*path*

в таблицу

`_Stream`

базы данных

*database*

с именем потока

*name*

.

#### `msilib.gen_uuid()`

Возвращает новый UUID в формате, который обычно требуется для MSI (то есть в фигурных скобках, все шестнадцатеричные цифры в верхнем регистре).

> **См. также**
>
> [FCICreateFile](https://python-all.ru/3.1/library/msilib.html) [UuidCreate](https://python-all.ru/3.1/library/msilib.html) [UuidToString](https://python-all.ru/3.1/library/msilib.html)

## 32.1.1. Объекты базы данных

#### `Database.OpenView(sql)`

Возвращает объект представления вызовом

`MSIDatabaseOpenView()`

.

*sql*

– SQL-выражение для выполнения.

#### `Database.Commit()`

Фиксирует ожидающие изменения в текущей транзакции вызовом

`MSIDatabaseCommit()`

.

#### `Database.GetSummaryInformation(count)`

Возвращает новый объект сводной информации вызовом

`MsiGetSummaryInformation()`

.

*count*

– максимальное количество обновлённых значений.

> **См. также**
>
> [MSIDatabaseOpenView](https://python-all.ru/3.1/library/msilib.html) [MSIDatabaseCommit](https://python-all.ru/3.1/library/msilib.html) [MSIGetSummaryInformation](https://python-all.ru/3.1/library/msilib.html)

## 32.1.2. Объекты представления

#### `View.Execute(params)`

Выполняет SQL-запрос представления через

`MSIViewExecute()`

. Если

*params*

не равен

`None`

, это запись, описывающая фактические значения маркеров параметров в запросе.

#### `View.GetColumnInfo(kind)`

Возвращает запись с описанием столбцов представления через вызов

`MsiViewGetColumnInfo()`

.

*kind*

может быть

`MSICOLINFO_NAMES`

или

`MSICOLINFO_TYPES`

.

#### `View.Fetch()`

Возвращает результирующую запись запроса через вызов

`MsiViewFetch()`

.

#### `View.Modify(kind, data)`

Изменяет представление через вызов `MsiViewModify()`. *kind* может быть одним из: `MSIMODIFY_SEEK`, `MSIMODIFY_REFRESH`, `MSIMODIFY_INSERT`, `MSIMODIFY_UPDATE`, `MSIMODIFY_ASSIGN`, `MSIMODIFY_REPLACE`, `MSIMODIFY_MERGE`, `MSIMODIFY_DELETE`, `MSIMODIFY_INSERT_TEMPORARY`, `MSIMODIFY_VALIDATE`, `MSIMODIFY_VALIDATE_NEW`, `MSIMODIFY_VALIDATE_FIELD` или `MSIMODIFY_VALIDATE_DELETE`.

*data* должен быть записью, описывающей новые данные.

#### `View.Close()`

Закрывает представление через

`MsiViewClose()`

.

> **См. также**
>
> [MsiViewExecute](https://python-all.ru/3.1/library/msilib.html) [MSIViewGetColumnInfo](https://python-all.ru/3.1/library/msilib.html) [MsiViewFetch](https://python-all.ru/3.1/library/msilib.html) [MsiViewModify](https://python-all.ru/3.1/library/msilib.html) [MsiViewClose](https://python-all.ru/3.1/library/msilib.html)

## 32.1.3. Объекты сводной информации

#### `SummaryInformation.GetProperty(field)`

Возвращает свойство сводки через

`MsiSummaryInfoGetProperty()`

.

*field*

– это имя свойства и может быть одной из констант:

`PID_CODEPAGE`

,

`PID_TITLE`

,

`PID_SUBJECT`

,

`PID_AUTHOR`

,

`PID_KEYWORDS`

,

`PID_COMMENTS`

,

`PID_TEMPLATE`

,

`PID_LASTAUTHOR`

,

`PID_REVNUMBER`

,

`PID_LASTPRINTED`

,

`PID_CREATE_DTM`

,

`PID_LASTSAVE_DTM`

,

`PID_PAGECOUNT`

,

`PID_WORDCOUNT`

,

`PID_CHARCOUNT`

,

`PID_APPNAME`

или

`PID_SECURITY`

.

#### `SummaryInformation.GetPropertyCount()`

Возвращает количество свойств сводки через

`MsiSummaryInfoGetPropertyCount()`

.

#### `SummaryInformation.SetProperty(field, value)`

Устанавливает свойство через

`MsiSummaryInfoSetProperty()`

.

*field*

может принимать те же значения, что и в

[`GetProperty()`](https://python-all.ru/3.1/library/msilib.html#msilib.SummaryInformation.GetProperty)

.

*value*

– это новое значение свойства. Возможные типы значений – целое число и строка.

#### `SummaryInformation.Persist()`

Записывает изменённые свойства в поток сводной информации, используя

`MsiSummaryInfoPersist()`

.

> **См. также**
>
> [MsiSummaryInfoGetProperty](https://python-all.ru/3.1/library/msilib.html) [MsiSummaryInfoGetPropertyCount](https://python-all.ru/3.1/library/msilib.html) [MsiSummaryInfoSetProperty](https://python-all.ru/3.1/library/msilib.html) [MsiSummaryInfoPersist](https://python-all.ru/3.1/library/msilib.html)

## 32.1.4. Объекты Record

#### `Record.GetFieldCount()`

Возвращает количество полей записи через

`MsiRecordGetFieldCount()`

.

#### `Record.GetInteger(field)`

Возвращает значение

*поля*

в виде целого числа, где это возможно.

*поле*

должно быть целым числом.

#### `Record.GetString(field)`

Возвращает значение

*поля*

в виде строки, где это возможно.

*поле*

должно быть целым числом.

#### `Record.SetString(field, value)`

Устанавливает

*field*

в

*value*

через

`MsiRecordSetString()`

.

*field*

должен быть целым числом, а

*value*

– строкой.

#### `Record.SetStream(field, value)`

Устанавливает

*field*

в содержимое файла с именем

*value*

через

`MsiRecordSetStream()`

.

*field*

должен быть целым числом, а

*value*

– строкой.

#### `Record.SetInteger(field, value)`

Устанавливает

*field*

в

*value*

через

`MsiRecordSetInteger()`

.

*field*

и

*value*

должны быть целыми числами.

#### `Record.ClearData()`

Устанавливает все поля записи в 0 через

`MsiRecordClearData()`

.

> **См. также**
>
> [MsiRecordGetFieldCount](https://python-all.ru/3.1/library/msilib.html) [MsiRecordSetString](https://python-all.ru/3.1/library/msilib.html) [MsiRecordSetStream](https://python-all.ru/3.1/library/msilib.html) [MsiRecordSetInteger](https://python-all.ru/3.1/library/msilib.html) [MsiRecordClear](https://python-all.ru/3.1/library/msilib.html)

## 32.1.5. Ошибки

Все обёртки вокруг функций MSI вызывают `MsiError`; строка внутри исключения содержит подробности.

## 32.1.6. Объекты CAB

#### `class msilib.CAB(name)`

Класс [`CAB`](https://python-all.ru/3.1/library/msilib.html#msilib.CAB) представляет CAB-файл. При создании MSI-файла файлы одновременно добавляются в таблицу `Files` и в CAB-файл. Затем, когда все файлы добавлены, CAB-файл можно записать и добавить в MSI-файл.

*Имя* – это имя CAB-файла в MSI-файле.

#### `append(full, file, logical)`

Добавляет файл с полным именем *полный* в CAB-файл под именем *логическое*. Если уже существует файл с именем *логическое*, создаётся новое имя файла.

Возвращает индекс файла в CAB-файле и новое имя файла внутри CAB-файла.

#### `commit(database)`

Генерирует CAB-файл, добавляет его как поток данных в MSI-файл, помещает в таблицу

`Media`

и удаляет созданный файл с диска.

## 32.1.7. Объекты Directory

#### `class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])`

Создаёт новый каталог в таблице Directory. Для каталога в каждый момент времени существует текущий компонент, который либо явно создаётся через [`start_component()`](https://python-all.ru/3.1/library/msilib.html#msilib.Directory.start_component), либо неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Чтобы создать каталог, необходимо указать базовый объект каталога (может быть `None`), путь к физическому каталогу и логическое имя каталога. *default* задаёт слот DefaultDir в таблице каталогов. *componentflags* задаёт флаги по умолчанию для новых компонентов.

#### `start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)`

Добавляет запись в таблицу Component и делает этот компонент текущим для данного каталога. Если имя компонента не указано, используется имя каталога. Если не указан

*feature*

, используется текущий признак (feature). Если не указаны

*flags*

, используются флаги по умолчанию для каталога. Если не указан

*keyfile*

, KeyPath в таблице Component остаётся пустым.

#### `add_file(file, src=None, version=None, language=None)`

Добавляет файл в текущий компонент каталога, начиная новый, если текущего компонента нет. По умолчанию имя файла в исходном расположении и в таблице File совпадает. Если указан файл

*src*

, путь интерпретируется относительно текущего каталога. Дополнительно можно указать

*version*

и

*language*

для записи в таблице File.

#### `glob(pattern, exclude=None)`

Добавляет в текущий компонент файлы, соответствующие glob-шаблону. Отдельные файлы можно исключить с помощью списка

*exclude*

.

#### `remove_pyc()`

Удаляет файлы

`.pyc`

/

`.pyo`

при удалении.

> **См. также**
>
> [Таблица каталогов](https://python-all.ru/3.1/library/msilib.html) [Таблица файлов](https://python-all.ru/3.1/library/msilib.html) [Таблица компонентов](https://python-all.ru/3.1/library/msilib.html) [Таблица FeatureComponents](https://python-all.ru/3.1/library/msilib.html)

## 32.1.8. Компоненты

#### `class msilib.Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0)`

Добавляет новую запись в таблицу `Feature`, используя значения *id*, *parent.id*, *title*, *desc*, *display*, *level*, *directory* и *attributes*. Полученный объект функции можно передать методу `start_component()` объекта [`Directory`](https://python-all.ru/3.1/library/msilib.html#msilib.Directory).

#### `set_current()`

Сделать этот компонент текущим компонентом

`msilib`

. Новые компоненты автоматически добавляются в компонент по умолчанию, если компонент не указан явно.

> **См. также**
>
> [Таблица функций](https://python-all.ru/3.1/library/msilib.html)

## 32.1.9. Классы GUI

`msilib` предоставляет несколько классов, оборачивающих GUI-таблицы в базе данных MSI. Однако стандартный пользовательский интерфейс не предоставляется; используйте `bdist_msi` для создания MSI-файлов с интерфейсом для установки пакетов Python.

#### `class msilib.Control(dlg, name)`

Базовый класс для элементов управления диалогом. *dlg* – это объект диалога, которому принадлежит элемент управления, а *name* – имя элемента управления.

#### `event(event, argument, condition=1, ordering=None)`

Создаёт запись в таблице

`ControlEvent`

для этого элемента управления.

#### `mapping(event, attribute)`

Создаёт запись в таблице

`EventMapping`

для этого элемента управления.

#### `condition(action, condition)`

Создаёт запись в таблице

`ControlCondition`

для этого элемента управления.

#### `class msilib.RadioButtonGroup(dlg, name, property)`

Создаёт элемент управления «переключатель» (radio button) с именем *name*. *property* – это свойство установщика, которое устанавливается при выборе переключателя.

#### `add(name, x, y, width, height, text, value=None)`

Добавляет переключатель с именем

*name*

в группу, с координатами

*x*

,

*y*

,

*width*

,

*height*

и меткой

*text*

. Если

*value*

равно

`None`

, оно по умолчанию принимает значение

*name*

.

#### `class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)`

Возвращает новый объект [`Dialog`](https://python-all.ru/3.1/library/msilib.html#msilib.Dialog). В таблицу `Dialog` добавляется запись с указанными координатами, атрибутами диалога, заголовком, именами первого, стандартного и отменяющего элементов управления.

#### `control(name, type, x, y, width, height, attributes, property, text, control_next, help)`

Возвращает новый объект [`Control`](https://python-all.ru/3.1/library/msilib.html#msilib.Control). В таблицу `Control` добавляется запись с указанными параметрами.

Это универсальный метод; для конкретных типов предусмотрены специализированные методы.

#### `text(name, x, y, width, height, attributes, text)`

Добавляет и возвращает элемент управления

`Text`

.

#### `bitmap(name, x, y, width, height, text)`

Добавляет и возвращает элемент управления

`Bitmap`

.

#### `line(name, x, y, width, height)`

Добавляет и возвращает элемент управления

`Line`

.

#### `pushbutton(name, x, y, width, height, attributes, text, next_control)`

Добавляет и возвращает элемент управления

`PushButton`

.

#### `radiogroup(name, x, y, width, height, attributes, property, text, next_control)`

Добавляет и возвращает элемент управления

`RadioButtonGroup`

.

#### `checkbox(name, x, y, width, height, attributes, property, text, next_control)`

Добавляет и возвращает элемент управления

`CheckBox`

.

> **См. также**
>
> [Диалоговая таблица](https://python-all.ru/3.1/library/msilib.html) [Таблица элементов управления](https://python-all.ru/3.1/library/msilib.html) [Типы элементов управления](https://python-all.ru/3.1/library/msilib.html) [Таблица условий элементов управления](https://python-all.ru/3.1/library/msilib.html) [Таблица событий элементов управления](https://python-all.ru/3.1/library/msilib.html) [Таблица сопоставления событий](https://python-all.ru/3.1/library/msilib.html) [Таблица переключателей](https://python-all.ru/3.1/library/msilib.html)

## 32.1.10. Предварительно вычисленные таблицы

`msilib` предоставляет несколько подпакетов, которые содержат только определения схем и таблиц. В настоящее время эти определения основаны на MSI версии 2.0.

#### `msilib.schema`

Это стандартная схема MSI для MSI 2.0, причём переменная

*tables*

содержит список определений таблиц, а

*\_Validation\_records*

предоставляет данные для проверки MSI.

#### `msilib.sequence`

Этот модуль содержит содержимое таблиц для стандартных таблиц последовательностей:

*AdminExecuteSequence*

,

*AdminUISequence*

,

*AdvtExecuteSequence*

,

*InstallExecuteSequence*

и

*InstallUISequence*

.

#### `msilib.text`

Этот модуль содержит определения таблиц UIText и ActionText для стандартных действий установщика.
