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

Исходный код: Lib/msilib/__init__.py


msilib поддерживает создание файлов Microsoft Installer (.msi). Поскольку эти файлы часто содержат встроенный CAB-файл (.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. Значение этих флагов см. в документации корпорации майкрософт; в зависимости от флагов открывается существующая база данных или создается новая база данных.

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

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

Database.Commit()

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

Database.GetSummaryInformation(count)

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

Database.Close()

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

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

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

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

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

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

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

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

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

glob(pattern, exclude=None)

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

remove_pyc()

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

Особенности

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 Table

Классы графический интерфейса пользователя

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