Skip to main content

34.1. msilib —读写Microsoft Installer文件

源代码: Lib/msilib/__init__.py


msilib 支持创建Microsoft Installer(.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文件中。

目前没有公开回调到Python的MSI创建的各个步骤。

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

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

msilib.add_data(database, table, records)

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

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

records 应该是元组的列表,每个元组包含根据表的模式的记录的所有字段。对于可选字段,可以传递 None

字段值可以是二进制类的int,字符串或实例。

class msilib.Binary(filename)

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

msilib.add_tables(database, module)

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

这通常用于安装序列表。

msilib.add_stream(database, name, path)

将文件 path 添加到 database_Stream 表中,流名称为 name

msilib.gen_uuid()

返回一个新的UUID,以MSI通常需要的格式(即大括号,所有十六进制的大写)。

34.1.1. 数据库对象

Database.OpenView(sql)

通过调用 MSIDatabaseOpenView() 返回一个视图对象。 sql 是将要执行的SQL语句。

Database.Commit()

通过调用 MSIDatabaseCommit(),在当前事务中提交待决的更改。

Database.GetSummaryInformation(count)

通过调用 MsiGetSummaryInformation() 返回一个新的摘要信息对象。 count 是更新值的最大数量。

34.1.2. 查看对象

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()

34.1.3. 摘要信息对象

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() 将修改后的属性写入摘要信息流。

34.1.4. 记录对象

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()field 设置为名为 value 的文件的内容。 field 必须是整数; value 一个字符串。

Record.SetInteger(field, value)

通过 MsiRecordSetInteger()field 设置为 valuefieldvalue 都必须是整数。

Record.ClearData()

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

34.1.5. 错误

围绕MSI功能的所有包装器提高 MsiError;字符串里面的异常将包含更多的细节。

34.1.6. CAB对象

class msilib.CAB(name)

CAB 表示CAB文件。在MSI构建期间,文件将同时添加到 Files 表和CAB文件。然后,当添加了所有文件后,可以写入CAB文件,然后将其添加到MSI文件。

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

append(full, file, logical)

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

返回CAB文件中文件的索引,以及CAB文件中文件的新名称。

commit(database)

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

34.1.7. 目录对象

class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])

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

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

向组件表中添加一个条目,并使此组件成为此目录的当前组件。如果没有给出组件名称,则使用目录名称。如果没有给出 feature,则使用当前特征。如果没有给出 flags,则使用目录的默认标志。如果未给出 keyfile,则KeyPath在组件表中保留为空。

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

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

glob(pattern, exclude=None)

向glob模式中指定的当前组件添加文件列表。单个文件可以在 exclude 列表中排除。

remove_pyc()

卸载时删除 .pyc/.pyo 文件。

34.1.8. 特征

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

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

set_current()

使此功能成为 msilib 的当前功能。新组件将自动添加到默认要素,除非显式指定要素。

参见

功能表

34.1.9. GUI类

msilib 提供了几个将GUI表包装在MSI数据库中的类。然而,没有提供标准用户界面;使用 bdist_msi 创建具有用于安装Python包的用户界面的MSI文件。

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 的单选按钮添加到组,在坐标 xywidthheight,并使用标签 text。如果 valueNone,它默认为 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 控件。

34.1.10. 预计算表

msilib 提供了几个只包含模式和表定义的子包。目前,这些定义基于MSI 2.0版。

msilib.schema

这是MSI 2.0的标准MSI模式,其中 tables 变量提供表定义的列表,_Validation_records 提供用于MSI验证的数据。

msilib.sequence

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

msilib.text

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