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

msilib.md

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

1> **Источник:** https://python-all.ru/3.0/library/msilib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `msilib` – чтение и запись файлов установщика Microsoft89*Платформы:* Windows1011Модуль `msilib` поддерживает создание файлов Microsoft Installer (`.msi`). Поскольку такие файлы часто содержат встроенный «кабинетный» файл (`.cab`), он также предоставляет API для создания CAB-файлов. Поддержка чтения файлов `.cab` в настоящее время не реализована; чтение базы данных `.msi` возможно.1213Этот пакет предоставляет полный доступ ко всем таблицам в файле `.msi`, поэтому он является довольно низкоуровневым API. Два основных применения этого пакета – команда [`distutils`](https://python-all.ru/3.0/library/distutils.html#module-distutils) `bdist_msi` и создание самого установочного пакета Python (хотя в настоящее время для этого используется другая версия `msilib`).1415Содержимое пакета можно условно разделить на четыре части: низкоуровневые процедуры CAB, низкоуровневые процедуры MSI, высокоуровневые процедуры MSI и стандартные структуры таблиц.1617#### `[msilib.FCICreate]msilib.FCICreate(cabname, files)`1819Создаёт новый CAB-файл с именем *cabname*. *files* должен быть списком кортежей, каждый из которых содержит имя файла на диске и имя файла внутри CAB-файла.2021Файлы добавляются в CAB-файл в том порядке, в котором они указаны в списке. Все файлы добавляются в один CAB-файл с использованием алгоритма сжатия MSZIP.2223Колбэки в Python для различных этапов создания MSI в настоящее время не предоставлены.2425#### `[msilib.UuidCreate]msilib.UuidCreate()`2627Возвращает строковое представление нового уникального идентификатора. Эта функция оборачивает вызовы Windows API2829`UuidCreate`3031и3233`UuidToString`3435.3637#### `[msilib.OpenDatabase]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]msilib.CreateRecord(count)`7475Возвращает новый объект записи, вызывая7677`MSICreateRecord`7879.8081*count*8283– количество полей записи.8485#### `[msilib.init_database]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]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#### `[msilib.Binary]class msilib.Binary(filename)`104105Представляет записи в таблице Binary; вставка такого объекта через106107[`add_data()`](https://python-all.ru/3.0/library/msilib.html#msilib.add_data)108109считывает файл с именем110111*filename*112113в таблицу.114115#### `[msilib.add_tables]msilib.add_tables(database, module)`116117Добавляет всё содержимое таблиц из *module* в *database*. *module* должен содержать атрибут *tables*, перечисляющий все таблицы, для которых должно быть добавлено содержимое, и по одному атрибуту на каждую таблицу, содержащему фактические данные.118119Обычно используется для установки таблиц последовательности.120121#### `[msilib.add_stream]msilib.add_stream(database, name, path)`122123Добавляет файл124125*path*126127в таблицу128129`_Stream`130131базы данных132133*database*134135с именем потока136137*name*138139.140141#### `[msilib.gen_uuid]msilib.gen_uuid()`142143Возвращает новый UUID в формате, который обычно требуется для MSI (то есть в фигурных скобках, все шестнадцатеричные цифры в верхнем регистре).144145> **См. также**146>147> [FCICreateFile](https://python-all.ru/3.0/library/msilib.html) [UuidCreate](https://python-all.ru/3.0/library/msilib.html) [UuidToString](https://python-all.ru/3.0/library/msilib.html)148149## Объекты базы данных150151#### `[msilib.Database.OpenView]Database.OpenView(sql)`152153Возвращает объект представления, вызывая154155`MSIDatabaseOpenView`156157.158159*sql*160161– выполняемый SQL-запрос.162163#### `[msilib.Database.Commit]Database.Commit()`164165Фиксирует ожидающие изменения в текущей транзакции, вызывая166167`MSIDatabaseCommit`168169.170171#### `[msilib.Database.GetSummaryInformation]Database.GetSummaryInformation(count)`172173Возвращает новый объект сводных сведений, вызывая174175`MsiGetSummaryInformation`176177.178179*count*180181– максимальное количество обновляемых значений.182183> **См. также**184>185> [MSIDatabaseOpenView](https://python-all.ru/3.0/library/msilib.html) [MSIDatabaseCommit](https://python-all.ru/3.0/library/msilib.html) [MSIGetSummaryInformation](https://python-all.ru/3.0/library/msilib.html)186187## Объекты представления188189#### `[msilib.View.Execute]View.Execute(params)`190191Выполняет SQL-запрос представления через192193`MSIViewExecute`194195. Если196197*params*198199не равен200201`None`202203, это запись, описывающая фактические значения маркеров параметров в запросе.204205#### `[msilib.View.GetColumnInfo]View.GetColumnInfo(kind)`206207Возвращает запись, описывающую столбцы представления, вызывая208209`MsiViewGetColumnInfo`210211.212213*kind*214215может быть216217`MSICOLINFO_NAMES`218219или220221`MSICOLINFO_TYPES`222223.224225#### `[msilib.View.Fetch]View.Fetch()`226227Возвращает результирующую запись запроса, вызывая228229`MsiViewFetch`230231.232233#### `[msilib.View.Modify]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#### `[msilib.View.Close]View.Close()`240241Закрывает представление через242243`MsiViewClose`244245.246247> **См. также**248>249> [MsiViewExecute](https://python-all.ru/3.0/library/msilib.html) [MSIViewGetColumnInfo](https://python-all.ru/3.0/library/msilib.html) [MsiViewFetch](https://python-all.ru/3.0/library/msilib.html) [MsiViewModify](https://python-all.ru/3.0/library/msilib.html) [MsiViewClose](https://python-all.ru/3.0/library/msilib.html)250251## Объекты сводной информации252253#### `[msilib.SummaryInformation.GetProperty]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#### `[msilib.SummaryInformation.GetPropertyCount]SummaryInformation.GetPropertyCount()`334335Возвращает количество свойств сводки через336337`MsiSummaryInfoGetPropertyCount`338339.340341#### `[msilib.SummaryInformation.SetProperty]SummaryInformation.SetProperty(field, value)`342343Устанавливает свойство через344345`MsiSummaryInfoSetProperty`346347.348349*field*350351может принимать те же значения, что и в352353[`GetProperty()`](https://python-all.ru/3.0/library/msilib.html#msilib.SummaryInformation.GetProperty)354355,356357*value*358359– новое значение свойства. Возможные типы значений – целое число и строка.360361#### `[msilib.SummaryInformation.Persist]SummaryInformation.Persist()`362363Записывает изменённые свойства в поток сводной информации, используя364365`MsiSummaryInfoPersist`366367.368369> **См. также**370>371> [MsiSummaryInfoGetProperty](https://python-all.ru/3.0/library/msilib.html) [MsiSummaryInfoGetPropertyCount](https://python-all.ru/3.0/library/msilib.html) [MsiSummaryInfoSetProperty](https://python-all.ru/3.0/library/msilib.html) [MsiSummaryInfoPersist](https://python-all.ru/3.0/library/msilib.html)372373## Объекты Record374375#### `[msilib.Record.GetFieldCount]Record.GetFieldCount()`376377Возвращает количество полей записи через378379`MsiRecordGetFieldCount`380381.382383#### `[msilib.Record.GetInteger]Record.GetInteger(field)`384385Возвращает значение386387*поля*388389в виде целого числа, где это возможно.390391*поле*392393должно быть целым числом.394395#### `[msilib.Record.GetString]Record.GetString(field)`396397Возвращает значение398399*поля*400401в виде строки, где это возможно.402403*поле*404405должно быть целым числом.406407#### `[msilib.Record.SetString]Record.SetString(field, value)`408409Устанавливает410411*field*412413в414415*value*416417через418419`MsiRecordSetString`420421.422423*field*424425должно быть целым числом,426427*value*428429– строкой.430431#### `[msilib.Record.SetStream]Record.SetStream(field, value)`432433Устанавливает434435*field*436437в содержимое файла с именем438439*value*440441через442443`MsiRecordSetStream`444445.446447*field*448449должно быть целым числом,450451*value*452453– строкой.454455#### `[msilib.Record.SetInteger]Record.SetInteger(field, value)`456457Устанавливает458459*field*460461в462463*value*464465через466467`MsiRecordSetInteger`468469. И470471*field*472473, и474475*value*476477должны быть целыми числами.478479#### `[msilib.Record.ClearData]Record.ClearData()`480481Устанавливает все поля записи в 0 через482483`MsiRecordClearData`484485.486487> **См. также**488>489> [MsiRecordGetFieldCount](https://python-all.ru/3.0/library/msilib.html) [MsiRecordSetString](https://python-all.ru/3.0/library/msilib.html) [MsiRecordSetStream](https://python-all.ru/3.0/library/msilib.html) [MsiRecordSetInteger](https://python-all.ru/3.0/library/msilib.html) [MsiRecordClear](https://python-all.ru/3.0/library/msilib.html)490491## Ошибки492493Все обёртки вокруг функций MSI вызывают `MsiError`; строка внутри исключения содержит подробности.494495## Объекты CAB496497#### `[msilib.CAB]class msilib.CAB(name)`498499Класс [`CAB`](https://python-all.ru/3.0/library/msilib.html#msilib.CAB) представляет CAB-файл. При создании MSI-файла файлы одновременно добавляются в таблицу `Files` и в CAB-файл. Затем, когда все файлы добавлены, CAB-файл можно записать и добавить в MSI-файл.500501*Имя* – это имя CAB-файла в MSI-файле.502503#### `[msilib.CAB.append]append(full, file, logical)`504505Добавляет файл с полным именем *полный* в CAB-файл под именем *логическое*. Если уже существует файл с именем *логическое*, создаётся новое имя файла.506507Возвращает индекс файла в CAB-файле и новое имя файла внутри CAB-файла.508509#### `[msilib.CAB.commit]commit(database)`510511Генерирует CAB-файл, добавляет его как поток данных в MSI-файл, помещает в таблицу512513`Media`514515и удаляет созданный файл с диска.516517## Объекты каталогов518519#### `[msilib.Directory]class msilib.Directory(database, cab, basedir, physical, logical, default, component[, componentflags])`520521Создаёт новый каталог в таблице Directory. Для каталога в каждый момент времени существует текущий компонент, который либо явно создаётся через [`start_component()`](https://python-all.ru/3.0/library/msilib.html#msilib.Directory.start_component), либо неявно при первом добавлении файлов. Файлы добавляются в текущий компонент и в CAB-файл. Чтобы создать каталог, необходимо указать базовый объект каталога (может быть `None`), путь к физическому каталогу и логическое имя каталога. *default* задаёт слот DefaultDir в таблице каталогов. *componentflags* задаёт флаги по умолчанию для новых компонентов.522523#### `[msilib.Directory.start_component]start_component([component[, feature[, flags[, keyfile[, uuid]]]]])`524525Добавляет запись в таблицу Component и делает этот компонент текущим для данного каталога. Если имя компонента не указано, используется имя каталога. Если не указан526527*feature*528529, используется текущий признак (feature). Если не указаны530531*flags*532533, используются флаги по умолчанию для каталога. Если не указан534535*keyfile*536537, KeyPath в таблице Component остаётся пустым.538539#### `[msilib.Directory.add_file]add_file(file[, src[, version[, language]]])`540541Добавляет файл в текущий компонент каталога, начиная новый, если текущего компонента нет. По умолчанию имя файла в исходном расположении и в таблице File совпадает. Если указан файл542543*src*544545, путь интерпретируется относительно текущего каталога. Дополнительно можно указать546547*version*548549и550551*language*552553для записи в таблице File.554555#### `[msilib.Directory.glob]glob(pattern[, exclude])`556557Добавляет в текущий компонент файлы, соответствующие glob-шаблону. Отдельные файлы можно исключить с помощью списка558559*exclude*560561.562563#### `[msilib.Directory.remove_pyc]remove_pyc()`564565Удаляет файлы566567`.pyc`568569/570571`.pyo`572573при удалении.574575> **См. также**576>577> [Таблица каталогов](https://python-all.ru/3.0/library/msilib.html) [Таблица файлов](https://python-all.ru/3.0/library/msilib.html) [Таблица компонентов](https://python-all.ru/3.0/library/msilib.html) [Таблица FeatureComponents](https://python-all.ru/3.0/library/msilib.html)578579## Возможности580581#### `[msilib.Feature]class msilib.Feature(database, id, title, desc, display[, level=1[, parent[, directory[, attributes=0]]]])`582583Добавляет новую запись в таблицу `Feature`, используя значения *id*, *parent.id*, *title*, *desc*, *display*, *level*, *directory* и *attributes*. Полученный объект функции можно передать методу `start_component()` объекта [`Directory`](https://python-all.ru/3.0/library/msilib.html#msilib.Directory).584585#### `[msilib.Feature.set_current]set_current()`586587Сделать этот компонент текущим компонентом588589`msilib`590591. Новые компоненты автоматически добавляются в компонент по умолчанию, если компонент не указан явно.592593> **См. также**594>595> [Таблица функций](https://python-all.ru/3.0/library/msilib.html)596597## Классы GUI598599`msilib` предоставляет несколько классов, оборачивающих GUI-таблицы в базе данных MSI. Однако стандартный пользовательский интерфейс не предоставляется; используйте `bdist_msi` для создания MSI-файлов с интерфейсом для установки пакетов Python.600601#### `[msilib.Control]class msilib.Control(dlg, name)`602603Базовый класс для элементов управления диалогом. *dlg* – это объект диалога, которому принадлежит элемент управления, а *name* – имя элемента управления.604605#### `[msilib.Control.event]event(event, argument[, condition=1[, ordering]])`606607Создаёт запись в таблице608609`ControlEvent`610611для этого элемента управления.612613#### `[msilib.Control.mapping]mapping(event, attribute)`614615Создаёт запись в таблице616617`EventMapping`618619для этого элемента управления.620621#### `[msilib.Control.condition]condition(action, condition)`622623Создаёт запись в таблице624625`ControlCondition`626627для этого элемента управления.628629#### `[msilib.RadioButtonGroup]class msilib.RadioButtonGroup(dlg, name, property)`630631Создаёт элемент управления «переключатель» (radio button) с именем *name*. *property* – это свойство установщика, которое устанавливается при выборе переключателя.632633#### `[msilib.RadioButtonGroup.add]add(name, x, y, width, height, text[, value])`634635Добавляет переключатель с именем636637*name*638639в группу, по координатам640641*x*642643,644645*y*646647,648649*width*650651,652653*height*654655, и с меткой656657*text*658659. Если660661*value*662663опущен, по умолчанию используется664665*name*666667.668669#### `[msilib.Dialog]class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)`670671Возвращает новый объект [`Dialog`](https://python-all.ru/3.0/library/msilib.html#msilib.Dialog). В таблицу `Dialog` добавляется запись с указанными координатами, атрибутами диалога, заголовком, именами первого, стандартного и отменяющего элементов управления.672673#### `[msilib.Dialog.control]control(name, type, x, y, width, height, attributes, property, text, control_next, help)`674675Возвращает новый объект [`Control`](https://python-all.ru/3.0/library/msilib.html#msilib.Control). В таблицу `Control` добавляется запись с указанными параметрами.676677Это универсальный метод; для конкретных типов предусмотрены специализированные методы.678679#### `[msilib.Dialog.text]text(name, x, y, width, height, attributes, text)`680681Добавляет и возвращает элемент управления682683`Text`684685.686687#### `[msilib.Dialog.bitmap]bitmap(name, x, y, width, height, text)`688689Добавляет и возвращает элемент управления690691`Bitmap`692693.694695#### `[msilib.Dialog.line]line(name, x, y, width, height)`696697Добавляет и возвращает элемент управления698699`Line`700701.702703#### `[msilib.Dialog.pushbutton]pushbutton(name, x, y, width, height, attributes, text, next_control)`704705Добавляет и возвращает элемент управления706707`PushButton`708709.710711#### `[msilib.Dialog.radiogroup]radiogroup(name, x, y, width, height, attributes, property, text, next_control)`712713Добавляет и возвращает элемент управления714715`RadioButtonGroup`716717.718719#### `[msilib.Dialog.checkbox]checkbox(name, x, y, width, height, attributes, property, text, next_control)`720721Добавляет и возвращает элемент управления722723`CheckBox`724725.726727> **См. также**728>729> [Диалоговая таблица](https://python-all.ru/3.0/library/msilib.html) [Таблица элементов управления](https://python-all.ru/3.0/library/msilib.html) [Типы элементов управления](https://python-all.ru/3.0/library/msilib.html) [Таблица условий элементов управления](https://python-all.ru/3.0/library/msilib.html) [Таблица событий элементов управления](https://python-all.ru/3.0/library/msilib.html) [Таблица сопоставления событий](https://python-all.ru/3.0/library/msilib.html) [Таблица переключателей](https://python-all.ru/3.0/library/msilib.html)730731## Предварительно вычисленные таблицы732733`msilib` предоставляет несколько подпакетов, которые содержат только определения схем и таблиц. В настоящее время эти определения основаны на MSI версии 2.0.734735#### `[msilib.schema]msilib.schema`736737Это стандартная схема MSI для MSI 2.0, причём переменная738739*tables*740741содержит список определений таблиц, а742743*\_Validation\_records*744745предоставляет данные для проверки MSI.746747#### `[msilib.sequence]msilib.sequence`748749Этот модуль содержит содержимое таблиц для стандартных таблиц последовательностей:750751*AdminExecuteSequence*752753,754755*AdminUISequence*756757,758759*AdvtExecuteSequence*760761,762763*InstallExecuteSequence*764765и766767*InstallUISequence*768769.770771#### `[msilib.text]msilib.text`772773Этот модуль содержит определения таблиц UIText и ActionText для стандартных действий установщика.774