msilib — Чтение и запись файлов установщика Microsoft


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

Данный пакет предназначен для предоставления полного доступа ко всем таблицам в файле .msi, поэтому это довольно низкоуровневый API. Двумя основными приложениями этого пакета являются команда 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.

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

class msilib.Binary(filename)

Представляет записи в двоичной таблице; вставка такого объекта с использованием 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 (т. е. в фигурных скобках и со всеми шестнадцатеричными цифрами в верхнем регистре).

Объекты Database

Database.OpenView(sql)

Возвращает объект представления, вызвав MSIDatabaseOpenView(). sql — оператор SQL для выполнения.

Database.Commit()

Фиксирует ожидающие изменения в текущей транзакции, вызвав по MSIDatabaseCommit().

Database.GetSummaryInformation(count)

Возвращает новый объект сводной информации, вызвав MsiGetSummaryInformation(). count — максимальное количество обновляемых значений.

Database.Close()

Закрывает объект базы данных через MsiCloseHandle().

Добавлено в версии 3.7.

View объекты

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().

Сводные информационные объекты

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(), value — это новое значение свойства. Возможные типы значений: целочисленные и строковые.

SummaryInformation.Persist()

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

Record объекты

Record.GetFieldCount()

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

Record.GetInteger(field)

По возможности возвращает значение field в виде целого числа. field должен быть целым числом.

Record.GetString(field)

По возможности возвращает значение field в виде строки. 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().

Ошибки

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

CAB-объекты

class msilib.CAB(name)

Класс CAB представляет CAB-файл. При построении MSI файлы будут добавлены одновременно в таблицу Files и в CAB-файл. Затем, когда все файлы добавлены, можно записать CAB-файл, а затем добавить его в MSI-файл.

name — это имя файла CAB в файле MSI.

append(full, file, logical)

Добавляет файл с путём full в CAB-файл под именем logical. Если файл с именем logical уже существует, создаётся новое имя файла.

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

commit(database)

Создаёт CAB-файл, затем добавляет его как поток в MSI-файл. Помещает его в таблицу Media и удаляет созданный файл с диска.

Объекты Directory

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

Создаёт новый каталог в таблице каталогов. В каждый момент времени для каталога существует текущий компонент, который создаётся либо явно через start_component(), либо неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Чтобы создать каталог, необходимо указать объект базового каталога (может быть None), путь к физическому каталогу и имя логического каталога. default указывает слот DefaultDir в таблице каталогов. componentflags указывает флаги по умолчанию, которые получают новые компоненты.

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

Добавляет запись в таблицу Component и делает данный компонент текущим компонентом для этого каталога. Если имя компонента не указано, используется имя каталога. Если feature не указан, используется текущая функция. Если flags не указан, используются флаги каталога по умолчанию. Если keyfile не указан, KeyPath остаётся пустым в таблице Component.

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

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

glob(pattern, exclude=None)

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

remove_pyc()

Удаляет файлы .pyc при удалении.

Feature

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.

set_current()

Сделать эту функцию текущей функцией msilib. Новые компоненты автоматически добавляются к функции по умолчанию, если функция не указана явно.

См.также

Таблица Feature

Классы графического интерфейса

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)

Создаёт переключатель с именем 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. Делается запись в таблице Dialog с указанными координатами, атрибутами диалога, заголовком, именем первого элемента управления, значением по умолчанию и отменой.

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

Возвращает новый объект 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.

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

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 для стандартных действий установщика.