35.1. msilib — 读取和写入 Microsoft 安装程序文件 — Python 文档
35.1. msilib — 读取和写入 Microsoft 安装程序文件
2.5 版中的新功能。
msilib 支持创建 Microsoft 安装程序 (.msi
) 文件。 因为这些文件通常包含一个嵌入的“cabinet”文件(.cab
),它还公开了一个 API 来创建 CAB 文件。 对读取.cab
文件的支持目前没有实现; 对 .msi
数据库的读取支持是可能的。
这个包旨在提供对 .msi
文件中所有表的完全访问,因此,它是一个相当低级的 API。 这个包的两个主要应用是 distutils 命令 bdist_msi
和 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[ X169X] 和 制造商 。
schema 必须是包含
tables
和_Validation_records
属性的模块对象; 通常,应该使用 msilib.schema。当这个函数返回时,数据库将只包含模式和验证记录。
- msilib.add_data(database, table, records)
将所有记录添加到数据库中名为table的表中。
table 参数必须是 MSI 模式中的预定义表之一,例如
'Feature'
、'File'
、'Component'
、'Dialog'
、'Control'
等records 应该是一个元组列表,每个元组根据表的模式包含记录的所有字段。 对于可选字段,可以传递
None
。字段值可以是 int 或 long 数字、字符串或 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
表中,流名称为name。
- msilib.gen_uuid()
- 返回一个新的 UUID,采用 MSI 通常要求的格式(即 在花括号中,并且所有十六进制数字都为大写)。
35.1.1. 数据库对象
- Database.OpenView(sql)
- 通过调用
MSIDatabaseOpenView()
返回一个视图对象。 sql 是要执行的 SQL 语句。
- Database.Commit()
- 通过调用
MSIDatabaseCommit()
提交当前事务中挂起的更改。
- Database.GetSummaryInformation(count)
- 通过调用
MsiGetSummaryInformation()
返回一个新的摘要信息对象。 count 是更新值的最大数量。
35.1.2. 查看对象
- 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
、[ 之一X87X]、MSIMODIFY_MERGE
、MSIMODIFY_DELETE
、MSIMODIFY_INSERT_TEMPORARY
、MSIMODIFY_VALIDATE
、MSIMODIFY_VALIDATE_NEW
、MSIMODIFY_VALIDATE_FIELD
或[X] X176X]。data 必须是描述新数据的记录。
- View.Close()
- 通过
MsiViewClose()
关闭视图。
35.1.3. 摘要信息对象
- SummaryInformation.GetProperty(field)
- 通过
MsiSummaryInfoGetProperty()
返回摘要的属性。 字段是属性的名称,可以是PID_CODEPAGE
、PID_TITLE
、PID_SUBJECT
、PID_AUTHOR
、[ X120X]、PID_COMMENTS
、PID_TEMPLATE
、PID_LASTAUTHOR
、PID_REVNUMBER
、PID_LASTPRINTED
、PID_CREATE_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()
将修改后的属性写入摘要信息流。
35.1.4. 记录对象
- Record.GetFieldCount()
- 通过
MsiRecordGetFieldCount()
返回记录的字段数。
- Record.GetInteger(field)
- 尽可能以整数形式返回 字段 的值。 field 必须是整数。
- Record.GetString(field)
- 尽可能以字符串形式返回 field 的值。 field 必须是整数。
- Record.SetString(field, value)
- 将 字段 设置为 值 至
MsiRecordSetString()
。 field 必须是整数; value 一个字符串。
- Record.SetStream(field, value)
- 将字段设置为名为value的文件的内容,通过
MsiRecordSetStream()
。 field 必须是整数; value 一个字符串。
- Record.SetInteger(field, value)
- 将 字段 设置为 值 至
MsiRecordSetInteger()
。 field 和 value 都必须是整数。
- Record.ClearData()
- 通过
MsiRecordClearData()
将记录的所有字段设置为 0。
35.1.5. 错误
MSI 函数的所有包装器都会引发 MSIError
; 异常中的字符串将包含更多详细信息。
35.1.6. 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
表中,并将生成的文件从磁盘中删除。
35.1.7. 目录对象
- class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])
在 Directory 表中创建一个新目录。 目录的每个时间点都有一个当前组件,它要么通过 start_component() 显式创建,要么在第一次添加文件时隐式创建。 文件被添加到当前组件和 cab 文件中。 要创建目录,需要指定基本目录对象(可以是
None
)、物理目录的路径和逻辑目录名称。 default 指定目录表中的 DefaultDir 槽。 componentflags 指定新组件获得的默认标志。- start_component([component[, feature[, flags[, keyfile[, uuid]]]]])
向组件表中添加一个条目,并使该组件成为该目录的当前组件。 如果未给出组件名称,则使用目录名称。 如果没有给出 特征,则使用当前特征。 如果没有给出 flags,则使用目录的默认标志。 如果没有给出 keyfile,则组件表中的 KeyPath 为空。
- add_file(file[, src[, version[, language]]])
向目录的当前组件添加一个文件,如果没有当前组件,则开始一个新的。 默认情况下,源文件和文件表中的文件名将相同。 如果指定了 src 文件,则它相对于当前目录进行解释。 可选地,可以为文件表中的条目指定 版本 和 语言 。
- glob(pattern[, exclude])
将文件列表添加到 glob 模式中指定的当前组件。 可以在 排除 列表中排除单个文件。
- remove_pyc()
卸载时删除
.pyc
/.pyo
文件。
35.1.8. 特征
- class msilib.Feature(database, id, title, desc, display[, level=1[, parent[, directory[, attributes=0]]]])
- 使用值 id, parent.id, title, desc 添加一条新记录到
Feature
表、显示、级别、目录和属性。 生成的特征对象可以传递给 Directory 的start_component()
方法。
- set_current()
- 将此功能设为 msilib 的当前功能。 除非明确指定功能,否则新组件会自动添加到默认功能中。
35.1.9. GUI类
msilib 提供了几个将 GUI 表包装在 MSI 数据库中的类。 但是,没有提供标准的用户界面; 使用 bdist_msi 创建带有用户界面的 MSI 文件,用于安装 Python 包。
- class msilib.Control(dlg, name)
对话框控件的基类。 dlg 是控件所属的对话框对象,name 是控件的名称。
- event(event, argument[, condition=1[, ordering]])
为此控件在
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])
- 将名为 name 的单选按钮添加到组中,坐标为 x, y, width, height ,并带有标签 text。 如果省略 value,则默认为 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
控件。
35.1.10。 预计算表
msilib 提供了一些仅包含模式和表定义的子包。 目前,这些定义基于 MSI 2.0 版。
- msilib.schema
- 这是 MSI 2.0 的标准 MSI 架构,tables 变量提供表定义列表,_Validation_records 提供 MSI 验证数据。
- msilib.sequence
- 此模块包含标准序列表的表内容:AdminExecuteSequence、AdminUISequence、AdvtExecuteSequence、InstallExecuteSequence和 InstallUISequence[X21X] ]。
- msilib.text
- 此模块包含 UIText 和 ActionText 表的定义,用于标准安装程序操作。