msilib
— 读取和写入 Microsoft Installer 文件¶
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_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
。此函数返回时,数据库将仅包含 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_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)¶
通过
MsiRecordSetString()
将 field 设置为 value。field 必须为整数;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)¶
使用值 id、parent.id、title、desc、display、level、directory 和 attributes 将新记录添加到
Feature
表。生成的 feature 对象可以传递给Directory
的start_component()
方法。
另请参见
GUI 类¶
msilib
提供了几个类,这些类将 MSI 数据库中的 GUI 表封装起来。但是,不提供标准用户界面。
- 类 msilib.控件(dlg, 名称)¶
对话框控件的基类。dlg 是控件所属的对话框对象,name 是控件的名称。
- 事件(事件, 参数, 条件=1, 排序=无)¶
为该控件在
ControlEvent
表中创建条目。
- 映射(事件, 属性)¶
为该控件在
EventMapping
表中创建条目。
- 条件(操作, 条件)¶
为该控件在
ControlCondition
表中创建条目。
- 类 msilib.单选按钮组(dlg, 名称, 属性)¶
创建一个名为 name 的单选按钮控件。当选中某个单选按钮时,property 是要设置的安装程序属性。
- 添加(名称, x, y, 宽度, 高度, 文本, 值=无)¶
在组中添加一个名为 name 的单选按钮,其坐标为 x、y、width、height,标签为 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¶
此模块包含标准序列表的表内容:AdminExecuteSequence、AdminUISequence、AdvtExecuteSequence、InstallExecuteSequence 和 InstallUISequence。
- msilib.text¶
此模块包含标准安装程序操作的 UIText 和 ActionText 表的定义。