msilib — 读取和写入 Microsoft 安装程序文件 — Python 文档

来自菜鸟教程
Python/docs/3.10/library/msilib
跳转至:导航、​搜索

msilib — 读取和写入 Microsoft 安装程序文件

源代码: :source:`Lib/msilib/__init__.py`



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_CREATEDIRECTMSIDBOPEN_CREATEMSIDBOPEN_DIRECTMSIDBOPEN_READONLYMSIDBOPEN_TRANSACT 之一,以及可能包括标志 MSIDBOPEN_PATCHFILE。 有关这些标志的含义,请参阅 Microsoft 文档; 根据标志,打开现有数据库或创建新数据库。
msilib.CreateRecord(count)
通过调用 MSICreateRecord() 返回一个新的记录对象。 count 是记录的字段数。
msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)

创建并返回一个新的数据库 name,用 schema 对其进行初始化,并设置属性 ProductNameProductCode、ProductVersion[ X169X] 和 制造商

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

当这个函数返回时,数据库将只包含模式和验证记录。

msilib.add_data(database, table, records)

将所有记录添加到数据库中名为table的表中。

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

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

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

class msilib.Binary(filename)
表示二进制表中的条目; 使用 add_data() 插入这样一个对象会将名为 filename 的文件读入表中。
msilib.add_tables(database, module)

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

这通常用于安装序列表。

msilib.add_stream(database, name, path)
将文件path添加到数据库_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)
执行视图的SQL查询,通过MSIViewExecute()。 如果 params 不是 None,则是描述查询中参数标记实际值的记录。
View.GetColumnInfo(kind)
通过调用MsiViewGetColumnInfo(),返回描述视图列的记录。 kind 可以是 MSICOLINFO_NAMESMSICOLINFO_TYPES
View.Fetch()
通过调用MsiViewFetch()返回查询的结果记录。
View.Modify(kind, data)

通过调用 MsiViewModify() 修改视图。 kind 可以是 MSIMODIFY_SEEKMSIMODIFY_REFRESHMSIMODIFY_INSERTMSIMODIFY_UPDATEMSIMODIFY_ASSIGN、[ 之一X87X]、MSIMODIFY_MERGEMSIMODIFY_DELETEMSIMODIFY_INSERT_TEMPORARYMSIMODIFY_VALIDATEMSIMODIFY_VALIDATE_NEWMSIMODIFY_VALIDATE_FIELD、或[X] X176X]。

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

View.Close()
通过 MsiViewClose() 关闭视图。

摘要信息对象

SummaryInformation.GetProperty(field)
通过 MsiSummaryInfoGetProperty() 返回摘要的属性。 字段是属性的名称,可以是PID_CODEPAGEPID_TITLEPID_SUBJECTPID_AUTHOR、[ X120X]、PID_COMMENTSPID_TEMPLATEPID_LASTAUTHORPID_REVNUMBERPID_LASTPRINTEDPID_CREATE_DTM ]、PID_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 必须是整数。
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()fieldvalue 都必须是整数。
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])

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

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

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

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

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

glob(pattern, exclude=None)

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

remove_pyc()

卸载时删除 .pyc 文件。

特征

class msilib.Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0)
使用值 id, parent.id, title, desc 添加一条新记录到 Feature 表、显示级别目录属性。 生成的特征对象可以传递给 Directorystart_component() 方法。
set_current()
将此功能设为 msilib 的当前功能。 除非明确指定功能,否则新组件会自动添加到默认功能中。

也可以看看

特征表


GUI类

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

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。 如果 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 控件。

预计算表

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

msilib.schema
这是 MSI 2.0 的标准 MSI 模式,tables 变量提供表定义列表,_Validation_records 提供 MSI 验证数据。
msilib.sequence
此模块包含标准序列表的表内容:AdminExecuteSequenceAdminUISequenceAdvtExecuteSequenceInstallExecuteSequence和 InstallUISequence[X21X] ]。
msilib.text
此模块包含 UIText 和 ActionText 表的定义,用于标准安装程序操作。