msilib.md
1> **Источник:** https://python-all.ru/3.10/library/msilib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib) – Чтение и запись файлов Microsoft Installer89**Исходный код:** [Lib/msilib/\_\_init\_\_.py](https://python-all.ru/src/3.10/Lib/msilib/__init__.py)1011Устарело с версии 3.11: Модуль [`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib) устарел (подробнее см. [**PEP 594**](https://python-all.ru/3.10/library/msilib.html)).1213---1415Модуль [`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib) поддерживает создание файлов Microsoft Installer (`.msi`). Поскольку такие файлы часто содержат встроенный «кабинетный» файл (`.cab`), он также предоставляет API для создания CAB-файлов. Поддержка чтения `.cab` файлов на данный момент не реализована; возможно чтение базы данных `.msi`.1617Этот пакет предоставляет полный доступ ко всем таблицам в файле `.msi`, поэтому это довольно низкоуровневый API. Два основных применения этого пакета – команда [`distutils`](https://python-all.ru/3.10/library/distutils.html#module-distutils) `bdist_msi` и создание самого установочного пакета Python (хотя в нём сейчас используется другая версия `msilib`).1819Содержимое пакета можно условно разделить на четыре части: низкоуровневые процедуры CAB, низкоуровневые процедуры MSI, высокоуровневые процедуры MSI и стандартные структуры таблиц.2021#### `msilib.FCICreate(cabname, files)`2223Создаёт новый CAB-файл с именем *cabname*. *files* должен быть списком кортежей, каждый из которых содержит имя файла на диске и имя файла внутри CAB-файла.2425Файлы добавляются в CAB-файл в том порядке, в котором они указаны в списке. Все файлы добавляются в один CAB-файл с использованием алгоритма сжатия MSZIP.2627Колбэки в Python для различных этапов создания MSI в настоящее время не предоставлены.2829#### `msilib.UuidCreate()`3031Возвращает строковое представление нового уникального идентификатора. Это обёртка над функциями Windows API `UuidCreate()` и `UuidToString()`.3233#### `msilib.OpenDatabase(path, persist)`3435Возвращает новый объект базы данных вызовом MsiOpenDatabase. *path* – это имя файла MSI; *persist* может быть одной из констант `MSIDBOPEN_CREATEDIRECT`, `MSIDBOPEN_CREATE`, `MSIDBOPEN_DIRECT`, `MSIDBOPEN_READONLY` или `MSIDBOPEN_TRANSACT` и может включать флаг `MSIDBOPEN_PATCHFILE`. См. документацию Microsoft для получения информации о значении этих флагов; в зависимости от флагов открывается существующая база данных или создаётся новая.3637#### `msilib.CreateRecord(count)`3839Возвращает новый объект записи вызовом `MSICreateRecord()`. *count* – это количество полей записи.4041#### `msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)`4243Создаёт и возвращает новую базу данных *name*, инициализирует её схемой *schema* и задаёт свойства *ProductName*, *ProductCode*, *ProductVersion* и *Manufacturer*.4445*schema* должен быть объектом модуля, содержащим атрибуты `tables` и `_Validation_records`; как правило, следует использовать [`msilib.schema`](https://python-all.ru/3.10/library/msilib.html#msilib.schema).4647База данных будет содержать только схему и записи проверки, когда эта функция завершится.4849#### `msilib.add_data(database, table, records)`5051Добавляет все *records* в таблицу с именем *table* в *database*.5253Аргумент *table* должен быть одной из предопределённых таблиц в схеме MSI, например `'Feature'`, `'File'`, `'Component'`, `'Dialog'`, `'Control'` и т.д.5455*records* должен быть списком кортежей, каждый из которых содержит все поля записи в соответствии со схемой таблицы. Для необязательных полей можно передать `None`.5657Значения полей могут быть целыми числами, строками или экземплярами класса Binary.5859#### `class msilib.Binary(filename)`6061Представляет записи в таблице Binary; вставка такого объекта с помощью [`add_data()`](https://python-all.ru/3.10/library/msilib.html#msilib.add_data) считывает файл с именем *filename* в таблицу.6263#### `msilib.add_tables(database, module)`6465Добавляет всё содержимое таблиц из *module* в *database*. *module* должен содержать атрибут *tables*, перечисляющий все таблицы, для которых должно быть добавлено содержимое, и по одному атрибуту на каждую таблицу, содержащему фактические данные.6667Обычно используется для установки таблиц последовательности.6869#### `msilib.add_stream(database, name, path)`7071Добавляет файл *path* в таблицу `_Stream` базы данных *database* с именем потока *name*.7273#### `msilib.gen_uuid()`7475Возвращает новый UUID в формате, который обычно требуется для MSI (то есть в фигурных скобках, все шестнадцатеричные цифры в верхнем регистре).7677> **См. также**78>79> [FCICreate](https://python-all.ru/3.10/library/msilib.html) [UuidCreate](https://python-all.ru/3.10/library/msilib.html) [UuidToString](https://python-all.ru/3.10/library/msilib.html)8081## Объекты базы данных8283#### `Database.OpenView(sql)`8485Возвращает объект представления, вызывая `MSIDatabaseOpenView()`. *sql* – это SQL-инструкция, которую нужно выполнить.8687#### `Database.Commit()`8889Фиксирует ожидающие изменения в текущей транзакции, вызывая `MSIDatabaseCommit()`.9091#### `Database.GetSummaryInformation(count)`9293Возвращает новый объект сводной информации, вызывая `MsiGetSummaryInformation()`. *count* – это максимальное количество обновлённых значений.9495#### `Database.Close()`9697Закрывает объект базы данных через `MsiCloseHandle()`.9899Добавлено в версии 3.7.100101> **См. также**102>103> [MSIDatabaseOpenView](https://python-all.ru/3.10/library/msilib.html) [MSIDatabaseCommit](https://python-all.ru/3.10/library/msilib.html) [MSIGetSummaryInformation](https://python-all.ru/3.10/library/msilib.html) [MsiCloseHandle](https://python-all.ru/3.10/library/msilib.html)104105## Объекты представления106107#### `View.Execute(params)`108109Выполняет SQL-запрос представления через `MSIViewExecute()`. Если *params* не равен `None`, то это запись, описывающая фактические значения токенов параметров в запросе.110111#### `View.GetColumnInfo(kind)`112113Возвращает запись, описывающую столбцы представления, вызывая `MsiViewGetColumnInfo()`. *kind* может быть либо `MSICOLINFO_NAMES`, либо `MSICOLINFO_TYPES`.114115#### `View.Fetch()`116117Возвращает результирующую запись запроса, вызывая `MsiViewFetch()`.118119#### `View.Modify(kind, data)`120121Изменяет представление, вызывая `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`.122123*data* должен быть записью, описывающей новые данные.124125#### `View.Close()`126127Закрывает представление через `MsiViewClose()`.128129> **См. также**130>131> [MsiViewExecute](https://python-all.ru/3.10/library/msilib.html) [MSIViewGetColumnInfo](https://python-all.ru/3.10/library/msilib.html) [MsiViewFetch](https://python-all.ru/3.10/library/msilib.html) [MsiViewModify](https://python-all.ru/3.10/library/msilib.html) [MsiViewClose](https://python-all.ru/3.10/library/msilib.html)132133## Объекты сводной информации134135#### `SummaryInformation.GetProperty(field)`136137Возвращает свойство сводки через `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`.138139#### `SummaryInformation.GetPropertyCount()`140141Возвращает количество свойств сводки через `MsiSummaryInfoGetPropertyCount()`.142143#### `SummaryInformation.SetProperty(field, value)`144145Устанавливает свойство через `MsiSummaryInfoSetProperty()`. *field* может иметь те же значения, что и в [`GetProperty()`](https://python-all.ru/3.10/library/msilib.html#msilib.SummaryInformation.GetProperty), *value* – это новое значение свойства. Возможные типы значений: целое число и строка.146147#### `SummaryInformation.Persist()`148149Записывает изменённые свойства в поток сводной информации, используя `MsiSummaryInfoPersist()`.150151> **См. также**152>153> [MsiSummaryInfoGetProperty](https://python-all.ru/3.10/library/msilib.html) [MsiSummaryInfoGetPropertyCount](https://python-all.ru/3.10/library/msilib.html) [MsiSummaryInfoSetProperty](https://python-all.ru/3.10/library/msilib.html) [MsiSummaryInfoPersist](https://python-all.ru/3.10/library/msilib.html)154155## Объекты Record156157#### `Record.GetFieldCount()`158159Возвращает количество полей записи, через `MsiRecordGetFieldCount()`.160161#### `Record.GetInteger(field)`162163Возвращает значение *поля* в виде целого числа, где это возможно. *поле* должно быть целым числом.164165#### `Record.GetString(field)`166167Возвращает значение *поля* в виде строки, где это возможно. *поле* должно быть целым числом.168169#### `Record.SetString(field, value)`170171Устанавливает *поле* в *значение* через `MsiRecordSetString()`. *поле* должно быть целым числом; *значение* – строкой.172173#### `Record.SetStream(field, value)`174175Устанавливает *поле* в содержимое файла с именем *значение*, через `MsiRecordSetStream()`. *поле* должно быть целым числом; *значение* – строкой.176177#### `Record.SetInteger(field, value)`178179Устанавливает *поле* в *значение* через `MsiRecordSetInteger()`. И *поле*, и *значение* должны быть целыми числами.180181#### `Record.ClearData()`182183Устанавливает все поля записи в 0, через `MsiRecordClearData()`.184185> **См. также**186>187> [MsiRecordGetFieldCount](https://python-all.ru/3.10/library/msilib.html) [MsiRecordSetString](https://python-all.ru/3.10/library/msilib.html) [MsiRecordSetStream](https://python-all.ru/3.10/library/msilib.html) [MsiRecordSetInteger](https://python-all.ru/3.10/library/msilib.html) [MsiRecordClearData](https://python-all.ru/3.10/library/msilib.html)188189## Ошибки190191Все обёртки вокруг функций MSI возбуждают `MSIError`; строка внутри исключения будет содержать больше подробностей.192193## Объекты CAB194195#### `class msilib.CAB(name)`196197Класс [`CAB`](https://python-all.ru/3.10/library/msilib.html#msilib.CAB) представляет CAB-файл. Во время создания MSI файлы добавляются одновременно в таблицу `Files` и в CAB-файл. Затем, когда все файлы добавлены, CAB-файл можно записать, а затем добавить в MSI-файл.198199*Имя* – это имя CAB-файла в MSI-файле.200201#### `append(full, file, logical)`202203Добавляет файл с полным именем *полный* в CAB-файл под именем *логическое*. Если уже существует файл с именем *логическое*, создаётся новое имя файла.204205Возвращает индекс файла в CAB-файле и новое имя файла внутри CAB-файла.206207#### `commit(database)`208209Создаёт CAB-файл, добавляет его как поток в MSI-файл, помещает его в таблицу `Media` и удаляет созданный файл с диска.210211## Объекты каталогов212213#### `class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])`214215Создаёт новую запись в таблице Directory. В каждый момент времени для каталога существует текущий компонент; он может быть создан явно через [`start_component()`](https://python-all.ru/3.10/library/msilib.html#msilib.Directory.start_component) или неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Для создания каталога нужно указать базовый объект каталога (может быть `None`), путь к физическому каталогу и логическое имя каталога. *default* задаёт слот DefaultDir в таблице Directory. *componentflags* задаёт флаги по умолчанию для новых компонентов.216217#### `start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)`218219Добавляет запись в таблицу Component и делает этот компонент текущим для данного каталога. Если имя компонента не указано, используется имя каталога. Если не указан *feature*, используется текущий признак (feature). Если не указаны *flags*, используются флаги по умолчанию для каталога. Если не указан *keyfile*, KeyPath в таблице Component остаётся пустым.220221#### `add_file(file, src=None, version=None, language=None)`222223Добавляет файл в текущий компонент каталога, начиная новый, если текущего компонента нет. По умолчанию имя файла в исходном расположении и в таблице File совпадает. Если указан файл *src*, путь интерпретируется относительно текущего каталога. Дополнительно можно указать *version* и *language* для записи в таблице File.224225#### `glob(pattern, exclude=None)`226227Добавляет в текущий компонент файлы, соответствующие glob-шаблону. Отдельные файлы можно исключить с помощью списка *exclude*.228229#### `remove_pyc()`230231Удаляет файлы `.pyc` при удалении.232233> **См. также**234>235> [Directory Table](https://python-all.ru/3.10/library/msilib.html) [File Table](https://python-all.ru/3.10/library/msilib.html) [Component Table](https://python-all.ru/3.10/library/msilib.html) [FeatureComponents Table](https://python-all.ru/3.10/library/msilib.html)236237## Возможности238239#### `class msilib.Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0)`240241Добавляет новую запись в таблицу `Feature`, используя значения *id*, *parent.id*, *title*, *desc*, *display*, *level*, *directory* и *attributes*. Полученный объект feature можно передать методу `start_component()` объекта [`Directory`](https://python-all.ru/3.10/library/msilib.html#msilib.Directory).242243#### `set_current()`244245Делает этот признак (feature) текущим для [`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib). Новые компоненты автоматически добавляются в признак по умолчанию, если не указан явно другой признак.246247> **См. также**248>249> [Feature Table](https://python-all.ru/3.10/library/msilib.html)250251## Классы GUI252253[`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib) предоставляет несколько классов, которые оборачивают таблицы GUI в базе данных MSI. Однако стандартный пользовательский интерфейс не предоставляется; используйте [`bdist_msi`](https://python-all.ru/3.10/distutils/apiref.html#module-distutils.command.bdist_msi) для создания MSI-файлов с пользовательским интерфейсом для установки пакетов Python.254255#### `class msilib.Control(dlg, name)`256257Базовый класс для элементов управления диалогом. *dlg* – это объект диалога, которому принадлежит элемент управления, а *name* – имя элемента управления.258259#### `event(event, argument, condition=1, ordering=None)`260261Создаёт запись в таблице `ControlEvent` для этого элемента управления.262263#### `mapping(event, attribute)`264265Создаёт запись в таблице `EventMapping` для этого элемента управления.266267#### `condition(action, condition)`268269Создаёт запись в таблице `ControlCondition` для этого элемента управления.270271#### `class msilib.RadioButtonGroup(dlg, name, property)`272273Создаёт элемент управления «переключатель» (radio button) с именем *name*. *property* – это свойство установщика, которое устанавливается при выборе переключателя.274275#### `add(name, x, y, width, height, text, value=None)`276277Добавляет переключатель с именем *name* в группу с координатами *x*, *y*, *width*, *height* и меткой *text*. Если *value* равно `None`, по умолчанию используется *name*.278279#### `class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)`280281Возвращает новый объект [`Dialog`](https://python-all.ru/3.10/library/msilib.html#msilib.Dialog). В таблицу `Dialog` добавляется запись с указанными координатами, атрибутами диалога, заголовком, именами первого, стандартного (default) и отменяющего (cancel) элементов управления.282283#### `control(name, type, x, y, width, height, attributes, property, text, control_next, help)`284285Возвращает новый объект [`Control`](https://python-all.ru/3.10/library/msilib.html#msilib.Control). Запись в таблице `Control` создаётся с указанными параметрами.286287Это универсальный метод; для конкретных типов предусмотрены специализированные методы.288289#### `text(name, x, y, width, height, attributes, text)`290291Добавляет и возвращает элемент управления `Text`.292293#### `bitmap(name, x, y, width, height, text)`294295Добавляет и возвращает элемент управления `Bitmap`.296297#### `line(name, x, y, width, height)`298299Добавляет и возвращает элемент управления `Line`.300301#### `pushbutton(name, x, y, width, height, attributes, text, next_control)`302303Добавляет и возвращает элемент управления `PushButton`.304305#### `radiogroup(name, x, y, width, height, attributes, property, text, next_control)`306307Добавляет и возвращает элемент управления `RadioButtonGroup`.308309#### `checkbox(name, x, y, width, height, attributes, property, text, next_control)`310311Добавляет и возвращает элемент управления `CheckBox`.312313> **См. также**314>315> [Диалоговая таблица](https://python-all.ru/3.10/library/msilib.html) [Таблица элементов управления](https://python-all.ru/3.10/library/msilib.html) [Типы элементов управления](https://python-all.ru/3.10/library/msilib.html) [Таблица условий элементов управления](https://python-all.ru/3.10/library/msilib.html) [Таблица событий элементов управления](https://python-all.ru/3.10/library/msilib.html) [Таблица сопоставления событий](https://python-all.ru/3.10/library/msilib.html) [Таблица переключателей](https://python-all.ru/3.10/library/msilib.html)316317## Предварительно вычисленные таблицы318319[`msilib`](https://python-all.ru/3.10/library/msilib.html#module-msilib) предоставляет несколько подпакетов, содержащих только определения схем и таблиц. В настоящее время эти определения основаны на MSI версии 2.0.320321#### `msilib.schema`322323Это стандартная схема MSI для MSI 2.0, причём переменная *tables* содержит список определений таблиц, а *\_Validation\_records* предоставляет данные для проверки MSI.324325#### `msilib.sequence`326327Этот модуль содержит содержимое таблиц для стандартных таблиц последовательностей: *AdminExecuteSequence*, *AdminUISequence*, *AdvtExecuteSequence*, *InstallExecuteSequence* и *InstallUISequence*.328329#### `msilib.text`330331Этот модуль содержит определения таблиц UIText и ActionText для стандартных действий установщика.332