msilib — 读取和写入 Microsoft Installer 文件

源代码: Lib/msilib/__init__.py

自版本 3.11 起已弃用,将在版本 3.13 中移除: msilib 模块已弃用(有关详细信息,请参阅 PEP 594)。


msilib 支持创建 Microsoft Installer (.msi) 文件。由于这些文件通常包含嵌入的“柜”文件 (.cab),因此它还公开了一个创建 CAB 文件的 API。目前尚未实现读取 .cab 文件的支持;可以读取 .msi 数据库的支持。

此软件包旨在提供对 .msi 文件中所有表的完全访问权限,因此,它是一个相当底层的 API。此软件包的一个主要应用是创建 Python 安装程序包本身(尽管目前使用的是 msilib 的不同版本)。

软件包内容大致可分为四部分:低级 CAB 例程、低级 MSI 例程、高级 MSI 例程和标准表结构。

msilib.FCICreate(cabname, files)

创建一个名为 cabname 的新 CAB 文件。files 必须是一个元组列表,每个元组包含磁盘上文件的名称和 CAB 文件中文件的名称。

文件按列表中出现的顺序添加到 CAB 文件中。所有文件都使用 MSZIP 压缩算法添加到单个 CAB 文件中。

目前尚未公开 MSI 创建各个步骤的 Python 回调。

msilib.UuidCreate()

返回新唯一标识符的字符串表示形式。这将包装 Windows API 函数 UuidCreate()UuidToString()

msilib.OpenDatabase(path, persist)

通过调用 MsiOpenDatabase 返回一个新数据库对象。path 是 MSI 文件的文件名;persist 可以是常量 MSIDBOPEN_CREATEDIRECTMSIDBOPEN_CREATEMSIDBOPEN_DIRECTMSIDBOPEN_READONLYMSIDBOPEN_TRANSACT 之一,并且可以包含标志 MSIDBOPEN_PATCHFILE。有关这些标志的含义,请参阅 Microsoft 文档;根据标志,将打开现有数据库或创建一个新数据库。

msilib.CreateRecord(count)

通过调用 MSICreateRecord() 返回一个新记录对象。count 是记录的字段数。

msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)

创建并返回一个新数据库name,使用schema 对其进行初始化,并设置属性ProductNameProductCodeProductVersionManufacturer

schema 必须是一个包含 tables_Validation_records 属性的模块对象;通常,应使用 msilib.schema

此函数返回时,数据库将仅包含 schema 和验证记录。

msilib.add_data(database, table, records)

将所有records 添加到database 中名为table 的表中。

table 参数必须是 MSI 架构中预定义的表之一,例如 'Feature''File''Component''Dialog''Control' 等。

records 应为元组列表,每个元组都包含根据表架构的所有记录字段。对于可选字段,可以传递 None

字段值可以是整数、字符串或 Binary 类的实例。

class msilib.Binary(filename)

表示 Binary 表中的条目;使用 add_data() 插入此类对象会将名为 filename 的文件读入表中。

msilib.add_tables(database, module)

module 中的所有表内容添加到 database 中。module 必须包含一个属性 tables,列出所有应添加内容的表,以及每个表的一个属性,该属性具有实际内容。

这通常用于安装序列表。

msilib.add_stream(database, name, path)

将文件 path 添加到 database_Stream 表中,流名称为 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)

通过 MSIViewExecute() 执行视图的 SQL 查询。如果 params 不为 None,它是一个记录,描述查询中参数标记的实际值。

View.GetColumnInfo(kind)

通过调用 MsiViewGetColumnInfo() 返回一个记录,描述视图的列。kind 可以是 MSICOLINFO_NAMESMSICOLINFO_TYPES

View.Fetch()

通过调用 MsiViewFetch() 返回查询的结果记录。

View.Modify(kind, data)

通过调用 MsiViewModify() 修改视图。kind 可以是 MSIMODIFY_SEEKMSIMODIFY_REFRESHMSIMODIFY_INSERTMSIMODIFY_UPDATEMSIMODIFY_ASSIGNMSIMODIFY_REPLACEMSIMODIFY_MERGEMSIMODIFY_DELETEMSIMODIFY_INSERT_TEMPORARYMSIMODIFY_VALIDATEMSIMODIFY_VALIDATE_NEWMSIMODIFY_VALIDATE_FIELDMSIMODIFY_VALIDATE_DELETE 中的一个。

data 必须是一条描述新数据的记录。

View.Close()

通过 MsiViewClose() 关闭视图。

摘要信息对象

SummaryInformation.GetProperty(field)

通过 MsiSummaryInfoGetProperty() 返回摘要的属性。field 是属性的名称,可以是常量 PID_CODEPAGEPID_TITLEPID_SUBJECTPID_AUTHORPID_KEYWORDSPID_COMMENTSPID_TEMPLATEPID_LASTAUTHORPID_REVNUMBERPID_LASTPRINTEDPID_CREATE_DTMPID_LASTSAVE_DTMPID_PAGECOUNTPID_WORDCOUNTPID_CHARCOUNTPID_APPNAMEPID_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)

通过 MsiRecordSetString()field 设置为 valuefield 必须为整数;value 为字符串。

Record.SetStream(field, value)

通过 MsiRecordSetStream(),将字段设置为名为的文件的内容。字段必须为整数;为字符串。

Record.SetInteger(field, value)

通过 MsiRecordSetInteger(),将字段设置为字段都必须为整数。

Record.ClearData()

通过 MsiRecordClearData(),将记录的所有字段设置为 0。

错误

MSI 函数周围的所有包装器都会引发 MSIError;异常内的字符串将包含更多详细信息。

CAB 对象

class msilib.CAB(name)

CAB 表示一个 CAB 文件。在 MSI 构建过程中,文件将同时添加到 Files 表和 CAB 文件中。然后,当所有文件都已添加后,可以写入 CAB 文件,然后将其添加到 MSI 文件中。

name 是 MSI 文件中 CAB 文件的名称。

append(full, file, logical)

将路径名为full 的文件添加到 CAB 文件中,其名称为logical。如果已存在名为logical 的文件,则会创建一个新的文件名。

返回 CAB 文件中文件的索引和 CAB 文件中文件的新名称。

commit(database)

生成一个 CAB 文件,将其作为流添加到 MSI 文件,将其放入 Media 表中,并从磁盘中删除生成的文件。

目录对象

msilib.目录(数据库, cab, 基础目录, 物理, 逻辑, 默认[, 组件标志])

在目录表中创建一个新目录。在每个时间点,目录都有一个当前组件,该组件要么通过 start_component() 显式创建,要么在首次添加文件时隐式创建。文件被添加到当前组件和 cab 文件中。要创建目录,需要指定一个基础目录对象(可以是 None)、物理目录的路径和一个逻辑目录名称。default 指定目录表中的 DefaultDir 槽。componentflags 指定新组件获得的默认标志。

start_component(组件=None, 功能=None, 标志=None, 密钥文件=None, uuid=None)

向组件表中添加一个条目,并使此组件成为此目录的当前组件。如果没有提供组件名称,则使用目录名称。如果没有提供功能,则使用当前功能。如果没有提供标志,则使用目录的默认标志。如果没有提供密钥文件,则组件表中的 KeyPath 保留为 null。

add_file(文件, src=None, 版本=None, 语言=None)

将文件添加到目录的当前组件,如果没有当前组件,则启动一个新组件。默认情况下,源中的文件名和文件表中的文件名将相同。如果指定了src 文件,则它将相对于当前目录进行解释。对于文件表中的条目,可以选择指定版本语言

glob(模式, 排除=None)

根据 glob 模式中指定的内容,将文件列表添加到当前组件。可以将各个文件排除在 exclude 列表中。

remove_pyc()

卸载时删除 .pyc 文件。

功能

class msilib.Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0)

使用值 idparent.idtitledescdisplayleveldirectoryattributes 将新记录添加到 Feature 表。生成的 feature 对象可以传递给 Directorystart_component() 方法。

set_current()

将此功能设为 msilib 的当前功能。除非明确指定了某个功能,否则新组件会自动添加到默认功能。

另请参见

功能表

GUI 类

msilib 提供了几个类,这些类将 MSI 数据库中的 GUI 表封装起来。但是,不提供标准用户界面。

msilib.控件(dlg, 名称)

对话框控件的基类。dlg 是控件所属的对话框对象,name 是控件的名称。

事件(事件, 参数, 条件=1, 排序=)

为该控件在 ControlEvent 表中创建条目。

映射(事件, 属性)

为该控件在 EventMapping 表中创建条目。

条件(操作, 条件)

为该控件在 ControlCondition 表中创建条目。

msilib.单选按钮组(dlg, 名称, 属性)

创建一个名为 name 的单选按钮控件。当选中某个单选按钮时,property 是要设置的安装程序属性。

添加(名称, x, y, 宽度, 高度, 文本, =)

在组中添加一个名为 name 的单选按钮,其坐标为 xywidthheight,标签为 text。如果 value,则默认为 name

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 2.0 的标准 MSI 架构,其中 tables 变量提供表定义列表,而 _Validation_records 提供 MSI 验证数据。

msilib.sequence

此模块包含标准序列表的表内容:AdminExecuteSequenceAdminUISequenceAdvtExecuteSequenceInstallExecuteSequenceInstallUISequence

msilib.text

此模块包含标准安装程序操作的 UIText 和 ActionText 表的定义。