Документация Python неофициальный перевод

msilib.md

322 строк · 24.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/msilib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 35.1. [`msilib`](https://python-all.ru/2.7/library/msilib.html#module-msilib) – Чтение и запись установочных файлов Microsoft Installer89Новое в версии 2.5.1011Модуль [`msilib`](https://python-all.ru/2.7/library/msilib.html#module-msilib) поддерживает создание файлов Microsoft Installer (`.msi`). Поскольку такие файлы часто содержат встроенный «кабинетный» файл (`.cab`), он также предоставляет API для создания CAB-файлов. Поддержка чтения `.cab` файлов на данный момент не реализована; возможно чтение базы данных `.msi`.1213Этот пакет предоставляет полный доступ ко всем таблицам в файле `.msi`, поэтому это довольно низкоуровневый API. Два основных применения этого пакета – команда [`distutils`](https://python-all.ru/2.7/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 API `UuidCreate()` и `UuidToString()`.2829#### `msilib.OpenDatabase(path, persist)`3031Возвращает новый объект базы данных вызовом MsiOpenDatabase. *path* – это имя файла MSI; *persist* может быть одной из констант `MSIDBOPEN_CREATEDIRECT`, `MSIDBOPEN_CREATE`, `MSIDBOPEN_DIRECT`, `MSIDBOPEN_READONLY` или `MSIDBOPEN_TRANSACT` и может включать флаг `MSIDBOPEN_PATCHFILE`. См. документацию Microsoft для получения информации о значении этих флагов; в зависимости от флагов открывается существующая база данных или создаётся новая.3233#### `msilib.CreateRecord(count)`3435Возвращает новый объект записи вызовом `MSICreateRecord()`. *count* – это количество полей записи.3637#### `msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)`3839Создаёт и возвращает новую базу данных *name*, инициализирует её схемой *schema* и задаёт свойства *ProductName*, *ProductCode*, *ProductVersion* и *Manufacturer*.4041*schema* должен быть объектом модуля, содержащим атрибуты `tables` и `_Validation_records`; как правило, следует использовать [`msilib.schema`](https://python-all.ru/2.7/library/msilib.html#msilib.schema).4243База данных будет содержать только схему и записи проверки, когда эта функция завершится.4445#### `msilib.add_data(database, table, records)`4647Добавляет все *records* в таблицу с именем *table* в *database*.4849Аргумент *table* должен быть одной из предопределённых таблиц в схеме MSI, например `'Feature'`, `'File'`, `'Component'`, `'Dialog'`, `'Control'` и т.д.5051*records* должен быть списком кортежей, каждый из которых содержит все поля записи в соответствии со схемой таблицы. Для необязательных полей можно передать `None`.5253Значения полей могут быть целыми числами (int или long), строками или экземплярами класса Binary.5455#### `class msilib.Binary(filename)`5657Представляет записи в таблице Binary; вставка такого объекта с помощью [`add_data()`](https://python-all.ru/2.7/library/msilib.html#msilib.add_data) считывает файл с именем *filename* в таблицу.5859#### `msilib.add_tables(database, module)`6061Добавляет всё содержимое таблиц из *module* в *database*. *module* должен содержать атрибут *tables*, перечисляющий все таблицы, для которых должно быть добавлено содержимое, и по одному атрибуту на каждую таблицу, содержащему фактические данные.6263Обычно используется для установки таблиц последовательности.6465#### `msilib.add_stream(database, name, path)`6667Добавляет файл *path* в таблицу `_Stream` базы данных *database* с именем потока *name*.6869#### `msilib.gen_uuid()`7071Возвращает новый UUID в формате, который обычно требуется для MSI (то есть в фигурных скобках, все шестнадцатеричные цифры в верхнем регистре).7273> **См. также**74>75> [FCICreateFile](https://python-all.ru/2.7/library/msilib.html) [UuidCreate](https://python-all.ru/2.7/library/msilib.html) [UuidToString](https://python-all.ru/2.7/library/msilib.html)7677## 35.1.1. Объекты базы данных7879#### `Database.OpenView(sql)`8081Возвращает объект представления, вызывая `MSIDatabaseOpenView()`. *sql* – это SQL-инструкция, которую нужно выполнить.8283#### `Database.Commit()`8485Фиксирует ожидающие изменения в текущей транзакции, вызывая `MSIDatabaseCommit()`.8687#### `Database.GetSummaryInformation(count)`8889Возвращает новый объект сводной информации, вызывая `MsiGetSummaryInformation()`. *count* – это максимальное количество обновлённых значений.9091> **См. также**92>93> [MSIDatabaseOpenView](https://python-all.ru/2.7/library/msilib.html) [MSIDatabaseCommit](https://python-all.ru/2.7/library/msilib.html) [MSIGetSummaryInformation](https://python-all.ru/2.7/library/msilib.html)9495## 35.1.2. Объекты представления9697#### `View.Execute(params)`9899Выполняет SQL-запрос представления через `MSIViewExecute()`. Если *params* не равен `None`, то это запись, описывающая фактические значения токенов параметров в запросе.100101#### `View.GetColumnInfo(kind)`102103Возвращает запись, описывающую столбцы представления, вызывая `MsiViewGetColumnInfo()`. *kind* может быть либо `MSICOLINFO_NAMES`, либо `MSICOLINFO_TYPES`.104105#### `View.Fetch()`106107Возвращает результирующую запись запроса, вызывая `MsiViewFetch()`.108109#### `View.Modify(kind, data)`110111Изменяет представление, вызывая `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`.112113*data* должен быть записью, описывающей новые данные.114115#### `View.Close()`116117Закрывает представление через `MsiViewClose()`.118119> **См. также**120>121> [MsiViewExecute](https://python-all.ru/2.7/library/msilib.html) [MSIViewGetColumnInfo](https://python-all.ru/2.7/library/msilib.html) [MsiViewFetch](https://python-all.ru/2.7/library/msilib.html) [MsiViewModify](https://python-all.ru/2.7/library/msilib.html) [MsiViewClose](https://python-all.ru/2.7/library/msilib.html)122123## 35.1.3. Объекты сводной информации124125#### `SummaryInformation.GetProperty(field)`126127Возвращает свойство сводки через `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`.128129#### `SummaryInformation.GetPropertyCount()`130131Возвращает количество свойств сводки через `MsiSummaryInfoGetPropertyCount()`.132133#### `SummaryInformation.SetProperty(field, value)`134135Устанавливает свойство через `MsiSummaryInfoSetProperty()`. *field* может иметь те же значения, что и в [`GetProperty()`](https://python-all.ru/2.7/library/msilib.html#msilib.SummaryInformation.GetProperty), *value* – это новое значение свойства. Возможные типы значений: целое число и строка.136137#### `SummaryInformation.Persist()`138139Записывает изменённые свойства в поток сводной информации, используя `MsiSummaryInfoPersist()`.140141> **См. также**142>143> [MsiSummaryInfoGetProperty](https://python-all.ru/2.7/library/msilib.html) [MsiSummaryInfoGetPropertyCount](https://python-all.ru/2.7/library/msilib.html) [MsiSummaryInfoSetProperty](https://python-all.ru/2.7/library/msilib.html) [MsiSummaryInfoPersist](https://python-all.ru/2.7/library/msilib.html)144145## 35.1.4. Объекты записей146147#### `Record.GetFieldCount()`148149Возвращает количество полей записи, через `MsiRecordGetFieldCount()`.150151#### `Record.GetInteger(field)`152153Возвращает значение *поля* в виде целого числа, где это возможно. *поле* должно быть целым числом.154155#### `Record.GetString(field)`156157Возвращает значение *поля* в виде строки, где это возможно. *поле* должно быть целым числом.158159#### `Record.SetString(field, value)`160161Устанавливает *поле* в *значение* через `MsiRecordSetString()`. *поле* должно быть целым числом; *значение* – строкой.162163#### `Record.SetStream(field, value)`164165Устанавливает *поле* в содержимое файла с именем *значение*, через `MsiRecordSetStream()`. *поле* должно быть целым числом; *значение* – строкой.166167#### `Record.SetInteger(field, value)`168169Устанавливает *поле* в *значение* через `MsiRecordSetInteger()`. И *поле*, и *значение* должны быть целыми числами.170171#### `Record.ClearData()`172173Устанавливает все поля записи в 0, через `MsiRecordClearData()`.174175> **См. также**176>177> [MsiRecordGetFieldCount](https://python-all.ru/2.7/library/msilib.html) [MsiRecordSetString](https://python-all.ru/2.7/library/msilib.html) [MsiRecordSetStream](https://python-all.ru/2.7/library/msilib.html) [MsiRecordSetInteger](https://python-all.ru/2.7/library/msilib.html) [MsiRecordClear](https://python-all.ru/2.7/library/msilib.html)178179## 35.1.5. Ошибки180181Все обёртки вокруг функций MSI возбуждают `MSIError`; строка внутри исключения будет содержать больше подробностей.182183## 35.1.6. Объекты CAB184185#### `class msilib.CAB(name)`186187Класс [`CAB`](https://python-all.ru/2.7/library/msilib.html#msilib.CAB) представляет CAB-файл. Во время создания MSI файлы добавляются одновременно в таблицу `Files` и в CAB-файл. Затем, когда все файлы добавлены, CAB-файл можно записать, а затем добавить в MSI-файл.188189*Имя* – это имя CAB-файла в MSI-файле.190191#### `append(full, file, logical)`192193Добавляет файл с полным именем *полный* в CAB-файл под именем *логическое*. Если уже существует файл с именем *логическое*, создаётся новое имя файла.194195Возвращает индекс файла в CAB-файле и новое имя файла внутри CAB-файла.196197#### `commit(database)`198199Создаёт CAB-файл, добавляет его как поток в MSI-файл, помещает его в таблицу `Media` и удаляет созданный файл с диска.200201## 35.1.7. Объекты каталогов202203#### `class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])`204205Создаёт новую запись в таблице Directory. В каждый момент времени для каталога существует текущий компонент; он может быть создан явно через [`start_component()`](https://python-all.ru/2.7/library/msilib.html#msilib.Directory.start_component) или неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Для создания каталога нужно указать базовый объект каталога (может быть `None`), путь к физическому каталогу и логическое имя каталога. *default* задаёт слот DefaultDir в таблице Directory. *componentflags* задаёт флаги по умолчанию для новых компонентов.206207#### `start_component([component[, feature[, flags[, keyfile[, uuid]]]]])`208209Добавляет запись в таблицу Component и делает этот компонент текущим для данного каталога. Если имя компонента не указано, используется имя каталога. Если не указан *feature*, используется текущий признак (feature). Если не указаны *flags*, используются флаги по умолчанию для каталога. Если не указан *keyfile*, KeyPath в таблице Component остаётся пустым.210211#### `add_file(file[, src[, version[, language]]])`212213Добавляет файл в текущий компонент каталога, начиная новый, если текущего компонента нет. По умолчанию имя файла в исходном расположении и в таблице File совпадает. Если указан файл *src*, путь интерпретируется относительно текущего каталога. Дополнительно можно указать *version* и *language* для записи в таблице File.214215#### `glob(pattern[, exclude])`216217Добавляет в текущий компонент файлы, соответствующие glob-шаблону. Отдельные файлы можно исключить с помощью списка *exclude*.218219#### `remove_pyc()`220221Удалить файлы `.pyc`/`.pyo` при удалении.222223> **См. также**224>225> [Таблица каталогов](https://python-all.ru/2.7/library/msilib.html) [Таблица файлов](https://python-all.ru/2.7/library/msilib.html) [Таблица компонентов](https://python-all.ru/2.7/library/msilib.html) [Таблица FeatureComponents](https://python-all.ru/2.7/library/msilib.html)226227## 35.1.8. Возможности228229#### `class msilib.Feature(database, id, title, desc, display[, level=1[, parent[, directory[, attributes=0]]]])`230231Добавляет новую запись в таблицу `Feature`, используя значения *id*, *parent.id*, *title*, *desc*, *display*, *level*, *directory* и *attributes*. Полученный объект feature можно передать методу `start_component()` объекта [`Directory`](https://python-all.ru/2.7/library/msilib.html#msilib.Directory).232233#### `set_current()`234235Делает этот признак (feature) текущим для [`msilib`](https://python-all.ru/2.7/library/msilib.html#module-msilib). Новые компоненты автоматически добавляются в признак по умолчанию, если не указан явно другой признак.236237> **См. также**238>239> [Таблица функций](https://python-all.ru/2.7/library/msilib.html)240241## 35.1.9. Классы GUI242243[`msilib`](https://python-all.ru/2.7/library/msilib.html#module-msilib) предоставляет несколько классов, которые оборачивают таблицы GUI в базе данных MSI. Однако стандартный пользовательский интерфейс не предоставляется; используйте [`bdist_msi`](https://python-all.ru/2.7/distutils/apiref.html#module-distutils.command.bdist_msi) для создания MSI-файлов с пользовательским интерфейсом для установки пакетов Python.244245#### `class msilib.Control(dlg, name)`246247Базовый класс для элементов управления диалогом. *dlg* – это объект диалога, которому принадлежит элемент управления, а *name* – имя элемента управления.248249#### `event(event, argument[, condition=1[, ordering]])`250251Создаёт запись в таблице `ControlEvent` для этого элемента управления.252253#### `mapping(event, attribute)`254255Создаёт запись в таблице `EventMapping` для этого элемента управления.256257#### `condition(action, condition)`258259Создаёт запись в таблице `ControlCondition` для этого элемента управления.260261#### `class msilib.RadioButtonGroup(dlg, name, property)`262263Создаёт элемент управления «переключатель» (radio button) с именем *name*. *property* – это свойство установщика, которое устанавливается при выборе переключателя.264265#### `add(name, x, y, width, height, text[, value])`266267Добавляет переключатель с именем *name* в группу, по координатам *x*, *y*, *width*, *height*, и с меткой *text*. Если *value* опущен, по умолчанию используется *name*.268269#### `class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)`270271Возвращает новый объект [`Dialog`](https://python-all.ru/2.7/library/msilib.html#msilib.Dialog). В таблицу `Dialog` добавляется запись с указанными координатами, атрибутами диалога, заголовком, именами первого, стандартного (default) и отменяющего (cancel) элементов управления.272273#### `control(name, type, x, y, width, height, attributes, property, text, control_next, help)`274275Возвращает новый объект [`Control`](https://python-all.ru/2.7/library/msilib.html#msilib.Control). Запись в таблице `Control` создаётся с указанными параметрами.276277Это универсальный метод; для конкретных типов предусмотрены специализированные методы.278279#### `text(name, x, y, width, height, attributes, text)`280281Добавляет и возвращает элемент управления `Text`.282283#### `bitmap(name, x, y, width, height, text)`284285Добавляет и возвращает элемент управления `Bitmap`.286287#### `line(name, x, y, width, height)`288289Добавляет и возвращает элемент управления `Line`.290291#### `pushbutton(name, x, y, width, height, attributes, text, next_control)`292293Добавляет и возвращает элемент управления `PushButton`.294295#### `radiogroup(name, x, y, width, height, attributes, property, text, next_control)`296297Добавляет и возвращает элемент управления `RadioButtonGroup`.298299#### `checkbox(name, x, y, width, height, attributes, property, text, next_control)`300301Добавляет и возвращает элемент управления `CheckBox`.302303> **См. также**304>305> [Диалоговая таблица](https://python-all.ru/2.7/library/msilib.html) [Таблица элементов управления](https://python-all.ru/2.7/library/msilib.html) [Типы элементов управления](https://python-all.ru/2.7/library/msilib.html) [Таблица условий элементов управления](https://python-all.ru/2.7/library/msilib.html) [Таблица событий элементов управления](https://python-all.ru/2.7/library/msilib.html) [Таблица сопоставления событий](https://python-all.ru/2.7/library/msilib.html) [Таблица переключателей](https://python-all.ru/2.7/library/msilib.html)306307## 35.1.10. Предварительно вычисленные таблицы308309[`msilib`](https://python-all.ru/2.7/library/msilib.html#module-msilib) предоставляет несколько подпакетов, содержащих только определения схем и таблиц. В настоящее время эти определения основаны на MSI версии 2.0.310311#### `msilib.schema`312313Это стандартная схема MSI для MSI 2.0, причём переменная *tables* содержит список определений таблиц, а *\_Validation\_records* предоставляет данные для проверки MSI.314315#### `msilib.sequence`316317Этот модуль содержит содержимое таблиц для стандартных таблиц последовательностей: *AdminExecuteSequence*, *AdminUISequence*, *AdvtExecuteSequence*, *InstallExecuteSequence* и *InstallUISequence*.318319#### `msilib.text`320321Этот модуль содержит определения таблиц UIText и ActionText для стандартных действий установщика.322