msilib.md
1> **Источник:** https://python-all.ru/3.1/library/msilib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 32.1. `msilib` – Чтение и запись файлов Microsoft Installer89*Платформы:* Windows1011Модуль `msilib` поддерживает создание файлов Microsoft Installer (`.msi`). Поскольку такие файлы часто содержат встроенный «кабинетный» файл (`.cab`), он также предоставляет API для создания CAB-файлов. Поддержка чтения файлов `.cab` в настоящее время не реализована; чтение базы данных `.msi` возможно.1213Этот пакет предоставляет полный доступ ко всем таблицам в файле `.msi`, поэтому он является довольно низкоуровневым API. Два основных применения этого пакета – команда [`distutils`](https://python-all.ru/3.1/library/distutils.html#module-distutils) `bdist_msi` и создание самого установочного пакета Python (хотя в настоящее время для этого используется другая версия `msilib`).1415Содержимое пакета можно условно разделить на четыре части: низкоуровневые процедуры CAB, низкоуровневые процедуры MSI, высокоуровневые процедуры MSI и стандартные структуры таблиц.1617#### `msilib.FCICreate(cabname, files)`1819Создаёт новый CAB-файл с именем *cabname*. *files* должен быть списком кортежей, каждый из которых содержит имя файла на диске и имя файла внутри CAB-файла.2021Файлы добавляются в CAB-файл в том порядке, в котором они указаны в списке. Все файлы добавляются в один CAB-файл с использованием алгоритма сжатия MSZIP.2223Колбэки в Python для различных этапов создания MSI в настоящее время не предоставлены.2425#### `msilib.UuidCreate()`2627Возвращает строковое представление нового уникального идентификатора. Эта функция оборачивает вызовы Windows API2829`UuidCreate()`3031и3233`UuidToString()`3435.3637#### `msilib.OpenDatabase(path, persist)`3839Возвращает новый объект базы данных вызовом MsiOpenDatabase.4041*path*4243– имя файла MSI;4445*persist*4647может быть одной из констант4849`MSIDBOPEN_CREATEDIRECT`5051,5253`MSIDBOPEN_CREATE`5455,5657`MSIDBOPEN_DIRECT`5859,6061`MSIDBOPEN_READONLY`6263или6465`MSIDBOPEN_TRANSACT`6667, и может включать флаг6869`MSIDBOPEN_PATCHFILE`7071. Смотрите документацию Microsoft для описания этих флагов; в зависимости от флагов открывается существующая база данных или создаётся новая.7273#### `msilib.CreateRecord(count)`7475Возвращает новый объект записи вызовом7677`MSICreateRecord()`7879.8081*count*8283– количество полей записи.8485#### `msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)`8687Создаёт и возвращает новую базу данных *name*, инициализирует её схемой *schema* и задаёт свойства *ProductName*, *ProductCode*, *ProductVersion* и *Manufacturer*.8889*schema* должен быть объектом модуля, содержащим атрибуты `tables` и `_Validation_records`; обычно следует использовать `msilib.schema`.9091База данных будет содержать только схему и записи проверки, когда эта функция завершится.9293#### `msilib.add_data(database, table, records)`9495Добавляет все *records* в таблицу с именем *table* в *database*.9697Аргумент *table* должен быть одной из предопределённых таблиц в схеме MSI, например `'Feature'`, `'File'`, `'Component'`, `'Dialog'`, `'Control'` и т.д.9899*records* должен быть списком кортежей, каждый из которых содержит все поля записи в соответствии со схемой таблицы. Для необязательных полей можно передать `None`.100101Значения полей могут быть целыми числами (int или long), строками или экземплярами класса Binary.102103#### `class msilib.Binary(filename)`104105Представляет записи в таблице Binary; вставка такого объекта через106107[`add_data()`](https://python-all.ru/3.1/library/msilib.html#msilib.add_data)108109считывает файл с именем110111*filename*112113в таблицу.114115#### `msilib.add_tables(database, module)`116117Добавляет всё содержимое таблиц из *module* в *database*. *module* должен содержать атрибут *tables*, перечисляющий все таблицы, для которых должно быть добавлено содержимое, и по одному атрибуту на каждую таблицу, содержащему фактические данные.118119Обычно используется для установки таблиц последовательности.120121#### `msilib.add_stream(database, name, path)`122123Добавляет файл124125*path*126127в таблицу128129`_Stream`130131базы данных132133*database*134135с именем потока136137*name*138139.140141#### `msilib.gen_uuid()`142143Возвращает новый UUID в формате, который обычно требуется для MSI (то есть в фигурных скобках, все шестнадцатеричные цифры в верхнем регистре).144145> **См. также**146>147> [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)148149## 32.1.1. Объекты базы данных150151#### `Database.OpenView(sql)`152153Возвращает объект представления вызовом154155`MSIDatabaseOpenView()`156157.158159*sql*160161– SQL-выражение для выполнения.162163#### `Database.Commit()`164165Фиксирует ожидающие изменения в текущей транзакции вызовом166167`MSIDatabaseCommit()`168169.170171#### `Database.GetSummaryInformation(count)`172173Возвращает новый объект сводной информации вызовом174175`MsiGetSummaryInformation()`176177.178179*count*180181– максимальное количество обновлённых значений.182183> **См. также**184>185> [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)186187## 32.1.2. Объекты представления188189#### `View.Execute(params)`190191Выполняет SQL-запрос представления через192193`MSIViewExecute()`194195. Если196197*params*198199не равен200201`None`202203, это запись, описывающая фактические значения маркеров параметров в запросе.204205#### `View.GetColumnInfo(kind)`206207Возвращает запись с описанием столбцов представления через вызов208209`MsiViewGetColumnInfo()`210211.212213*kind*214215может быть216217`MSICOLINFO_NAMES`218219или220221`MSICOLINFO_TYPES`222223.224225#### `View.Fetch()`226227Возвращает результирующую запись запроса через вызов228229`MsiViewFetch()`230231.232233#### `View.Modify(kind, data)`234235Изменяет представление через вызов `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`.236237*data* должен быть записью, описывающей новые данные.238239#### `View.Close()`240241Закрывает представление через242243`MsiViewClose()`244245.246247> **См. также**248>249> [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)250251## 32.1.3. Объекты сводной информации252253#### `SummaryInformation.GetProperty(field)`254255Возвращает свойство сводки через256257`MsiSummaryInfoGetProperty()`258259.260261*field*262263– это имя свойства и может быть одной из констант:264265`PID_CODEPAGE`266267,268269`PID_TITLE`270271,272273`PID_SUBJECT`274275,276277`PID_AUTHOR`278279,280281`PID_KEYWORDS`282283,284285`PID_COMMENTS`286287,288289`PID_TEMPLATE`290291,292293`PID_LASTAUTHOR`294295,296297`PID_REVNUMBER`298299,300301`PID_LASTPRINTED`302303,304305`PID_CREATE_DTM`306307,308309`PID_LASTSAVE_DTM`310311,312313`PID_PAGECOUNT`314315,316317`PID_WORDCOUNT`318319,320321`PID_CHARCOUNT`322323,324325`PID_APPNAME`326327или328329`PID_SECURITY`330331.332333#### `SummaryInformation.GetPropertyCount()`334335Возвращает количество свойств сводки через336337`MsiSummaryInfoGetPropertyCount()`338339.340341#### `SummaryInformation.SetProperty(field, value)`342343Устанавливает свойство через344345`MsiSummaryInfoSetProperty()`346347.348349*field*350351может принимать те же значения, что и в352353[`GetProperty()`](https://python-all.ru/3.1/library/msilib.html#msilib.SummaryInformation.GetProperty)354355.356357*value*358359– это новое значение свойства. Возможные типы значений – целое число и строка.360361#### `SummaryInformation.Persist()`362363Записывает изменённые свойства в поток сводной информации, используя364365`MsiSummaryInfoPersist()`366367.368369> **См. также**370>371> [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)372373## 32.1.4. Объекты Record374375#### `Record.GetFieldCount()`376377Возвращает количество полей записи через378379`MsiRecordGetFieldCount()`380381.382383#### `Record.GetInteger(field)`384385Возвращает значение386387*поля*388389в виде целого числа, где это возможно.390391*поле*392393должно быть целым числом.394395#### `Record.GetString(field)`396397Возвращает значение398399*поля*400401в виде строки, где это возможно.402403*поле*404405должно быть целым числом.406407#### `Record.SetString(field, value)`408409Устанавливает410411*field*412413в414415*value*416417через418419`MsiRecordSetString()`420421.422423*field*424425должен быть целым числом, а426427*value*428429– строкой.430431#### `Record.SetStream(field, value)`432433Устанавливает434435*field*436437в содержимое файла с именем438439*value*440441через442443`MsiRecordSetStream()`444445.446447*field*448449должен быть целым числом, а450451*value*452453– строкой.454455#### `Record.SetInteger(field, value)`456457Устанавливает458459*field*460461в462463*value*464465через466467`MsiRecordSetInteger()`468469.470471*field*472473и474475*value*476477должны быть целыми числами.478479#### `Record.ClearData()`480481Устанавливает все поля записи в 0 через482483`MsiRecordClearData()`484485.486487> **См. также**488>489> [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)490491## 32.1.5. Ошибки492493Все обёртки вокруг функций MSI вызывают `MsiError`; строка внутри исключения содержит подробности.494495## 32.1.6. Объекты CAB496497#### `class msilib.CAB(name)`498499Класс [`CAB`](https://python-all.ru/3.1/library/msilib.html#msilib.CAB) представляет CAB-файл. При создании MSI-файла файлы одновременно добавляются в таблицу `Files` и в CAB-файл. Затем, когда все файлы добавлены, CAB-файл можно записать и добавить в MSI-файл.500501*Имя* – это имя CAB-файла в MSI-файле.502503#### `append(full, file, logical)`504505Добавляет файл с полным именем *полный* в CAB-файл под именем *логическое*. Если уже существует файл с именем *логическое*, создаётся новое имя файла.506507Возвращает индекс файла в CAB-файле и новое имя файла внутри CAB-файла.508509#### `commit(database)`510511Генерирует CAB-файл, добавляет его как поток данных в MSI-файл, помещает в таблицу512513`Media`514515и удаляет созданный файл с диска.516517## 32.1.7. Объекты Directory518519#### `class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])`520521Создаёт новый каталог в таблице Directory. Для каталога в каждый момент времени существует текущий компонент, который либо явно создаётся через [`start_component()`](https://python-all.ru/3.1/library/msilib.html#msilib.Directory.start_component), либо неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Чтобы создать каталог, необходимо указать базовый объект каталога (может быть `None`), путь к физическому каталогу и логическое имя каталога. *default* задаёт слот DefaultDir в таблице каталогов. *componentflags* задаёт флаги по умолчанию для новых компонентов.522523#### `start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)`524525Добавляет запись в таблицу Component и делает этот компонент текущим для данного каталога. Если имя компонента не указано, используется имя каталога. Если не указан526527*feature*528529, используется текущий признак (feature). Если не указаны530531*flags*532533, используются флаги по умолчанию для каталога. Если не указан534535*keyfile*536537, KeyPath в таблице Component остаётся пустым.538539#### `add_file(file, src=None, version=None, language=None)`540541Добавляет файл в текущий компонент каталога, начиная новый, если текущего компонента нет. По умолчанию имя файла в исходном расположении и в таблице File совпадает. Если указан файл542543*src*544545, путь интерпретируется относительно текущего каталога. Дополнительно можно указать546547*version*548549и550551*language*552553для записи в таблице File.554555#### `glob(pattern, exclude=None)`556557Добавляет в текущий компонент файлы, соответствующие glob-шаблону. Отдельные файлы можно исключить с помощью списка558559*exclude*560561.562563#### `remove_pyc()`564565Удаляет файлы566567`.pyc`568569/570571`.pyo`572573при удалении.574575> **См. также**576>577> [Таблица каталогов](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)578579## 32.1.8. Компоненты580581#### `class msilib.Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0)`582583Добавляет новую запись в таблицу `Feature`, используя значения *id*, *parent.id*, *title*, *desc*, *display*, *level*, *directory* и *attributes*. Полученный объект функции можно передать методу `start_component()` объекта [`Directory`](https://python-all.ru/3.1/library/msilib.html#msilib.Directory).584585#### `set_current()`586587Сделать этот компонент текущим компонентом588589`msilib`590591. Новые компоненты автоматически добавляются в компонент по умолчанию, если компонент не указан явно.592593> **См. также**594>595> [Таблица функций](https://python-all.ru/3.1/library/msilib.html)596597## 32.1.9. Классы GUI598599`msilib` предоставляет несколько классов, оборачивающих GUI-таблицы в базе данных MSI. Однако стандартный пользовательский интерфейс не предоставляется; используйте `bdist_msi` для создания MSI-файлов с интерфейсом для установки пакетов Python.600601#### `class msilib.Control(dlg, name)`602603Базовый класс для элементов управления диалогом. *dlg* – это объект диалога, которому принадлежит элемент управления, а *name* – имя элемента управления.604605#### `event(event, argument, condition=1, ordering=None)`606607Создаёт запись в таблице608609`ControlEvent`610611для этого элемента управления.612613#### `mapping(event, attribute)`614615Создаёт запись в таблице616617`EventMapping`618619для этого элемента управления.620621#### `condition(action, condition)`622623Создаёт запись в таблице624625`ControlCondition`626627для этого элемента управления.628629#### `class msilib.RadioButtonGroup(dlg, name, property)`630631Создаёт элемент управления «переключатель» (radio button) с именем *name*. *property* – это свойство установщика, которое устанавливается при выборе переключателя.632633#### `add(name, x, y, width, height, text, value=None)`634635Добавляет переключатель с именем636637*name*638639в группу, с координатами640641*x*642643,644645*y*646647,648649*width*650651,652653*height*654655и меткой656657*text*658659. Если660661*value*662663равно664665`None`666667, оно по умолчанию принимает значение668669*name*670671.672673#### `class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)`674675Возвращает новый объект [`Dialog`](https://python-all.ru/3.1/library/msilib.html#msilib.Dialog). В таблицу `Dialog` добавляется запись с указанными координатами, атрибутами диалога, заголовком, именами первого, стандартного и отменяющего элементов управления.676677#### `control(name, type, x, y, width, height, attributes, property, text, control_next, help)`678679Возвращает новый объект [`Control`](https://python-all.ru/3.1/library/msilib.html#msilib.Control). В таблицу `Control` добавляется запись с указанными параметрами.680681Это универсальный метод; для конкретных типов предусмотрены специализированные методы.682683#### `text(name, x, y, width, height, attributes, text)`684685Добавляет и возвращает элемент управления686687`Text`688689.690691#### `bitmap(name, x, y, width, height, text)`692693Добавляет и возвращает элемент управления694695`Bitmap`696697.698699#### `line(name, x, y, width, height)`700701Добавляет и возвращает элемент управления702703`Line`704705.706707#### `pushbutton(name, x, y, width, height, attributes, text, next_control)`708709Добавляет и возвращает элемент управления710711`PushButton`712713.714715#### `radiogroup(name, x, y, width, height, attributes, property, text, next_control)`716717Добавляет и возвращает элемент управления718719`RadioButtonGroup`720721.722723#### `checkbox(name, x, y, width, height, attributes, property, text, next_control)`724725Добавляет и возвращает элемент управления726727`CheckBox`728729.730731> **См. также**732>733> [Диалоговая таблица](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)734735## 32.1.10. Предварительно вычисленные таблицы736737`msilib` предоставляет несколько подпакетов, которые содержат только определения схем и таблиц. В настоящее время эти определения основаны на MSI версии 2.0.738739#### `msilib.schema`740741Это стандартная схема MSI для MSI 2.0, причём переменная742743*tables*744745содержит список определений таблиц, а746747*\_Validation\_records*748749предоставляет данные для проверки MSI.750751#### `msilib.sequence`752753Этот модуль содержит содержимое таблиц для стандартных таблиц последовательностей:754755*AdminExecuteSequence*756757,758759*AdminUISequence*760761,762763*AdvtExecuteSequence*764765,766767*InstallExecuteSequence*768769и770771*InstallUISequence*772773.774775#### `msilib.text`776777Этот модуль содержит определения таблиц UIText и ActionText для стандартных действий установщика.778