msilib --- 读写 Microsoft Installer 文件¶

�代�: Lib/msilib/__init__.py

从 3.11 版起�建议使用,将在 3.13 版中移除: msilib 模�已被弃用(请�阅 PEP 594 了解详情)。


msilib 支�创建 Microsoft 安装程� (.msi) 文件。 由于这�文件往往包�一个嵌入的 "cabinet" 文件 (.cab),它也暴露了一个用于创建 CAB 文件的 API。 目�没有实现对读� .cab 文件的支�;对于读� .msi 数�库的支�则是�能的。

这个包的目标是�供对 .msi 文件中的全部表的完整访问,因此,它是一个相当低层级的 API。 这个包的一个主�应用是创建 Python 安装程�包本身 (尽管它目�是使用��版本的 msilib)。

这个包的内容�以大致分为四个部分:低层级 CAB 例程�低层级 MSI 例程�高层级 MSI 例程以�标准表结构。

msilib.FCICreate(cabname, files)¶

新建一个�为 cabname 的 CAB 文件。 files 必须是一个元组的列表,其中�个元组包��盘文件的�称,以� CAB 文件内文件的�称。

这些文件将按照它们在列表中出现的顺�被添加到 CAB 文件中。 所有文件都会被添加到�个 CAB 文件,使用 MSZIP 压缩算法。

目�没有暴露 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 应当被使用。

此此函数返回时该数�库将�包�表结构和验�记录。

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 语�。statement to execute.

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

Record.SetInteger(field, value)¶

通过 MsiRecordSetInteger() 将 field 设为 value。 field 和 value 必须为整数。

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 表,并从�盘移除所生�的文件。

目录对象¶

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 文件,它将被解读为相对于当�目录。 作为�选项,�以为文件表中的�目指定 version 和 language。

glob(pattern, exclude=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 表添加一�新记录。 结果特�对象�被传给 Directory 的 start_component() 方法。

set_current()¶

将此特�设为 msilib 的当�特�。 新组件会自动被添加到默认特�,除�显�指定了一个特�。

��

特�表

GUI 类¶

msilib �供了一些在 MSI 数�库中包装 GUI 表的类。 但是,并未�供标准用户接�。

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 的�选钮,设置�标为 x, y, width, height,标签为 text。 如果 value 为 None,则设置默认值 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 控件。

预计算的表¶

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 表的定义,用于标准安装器动作。