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

源代码: Lib/msilib/__init__.py


这个 msilib 支持创建Microsoft Installer (.msi )文件。因为这些文件通常包含一个嵌入的“cabinet”文件 (.cab ,它还公开了用于创建cab文件的API。支持阅读 .cab 文件当前未实现;读取对 .msi 数据库是可能的。

此包旨在提供对 .msi 因此,文件是一个相当低级的API。此包的两个主要应用程序是 distutils 命令 bdist_msi 以及创建python安装程序包本身(尽管它当前使用的是 msilib

包内容可以大致分为四部分:低级cab例程、低级msi例程、高级msi例程和标准表结构。

msilib.FCICreate(cabname, files)

创建名为的新cab文件 网名 . 文件夹 必须是元组列表,每个元组包含磁盘上文件的名称以及cab文件中文件的名称。

这些文件将按它们在列表中的显示顺序添加到cab文件中。所有文件都使用mszip压缩算法添加到单个cab文件中。

对于MSI创建的各个步骤,对python的回调目前未公开。

msilib.UuidCreate()

返回新的唯一标识符的字符串表示形式。这将封装Windows API函数 UuidCreate()UuidToString() .

msilib.OpenDatabase(path, persist)

通过调用msiOpenDatabase返回新的数据库对象。 path 是msi文件的文件名; 坚持 可以是常量之一 MSIDBOPEN_CREATEDIRECTMSIDBOPEN_CREATEMSIDBOPEN_DIRECTMSIDBOPEN_READONLYMSIDBOPEN_TRANSACT ,可以包括标志 MSIDBOPEN_PATCHFILE . 有关这些标志的含义,请参阅Microsoft文档;根据标志,将打开现有数据库或创建新数据库。

msilib.CreateRecord(count)

通过调用 MSICreateRecord() . 计数 是记录的字段数。

msilib.init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)

创建并返回新数据库 name ,初始化时使用 图式 ,并设置属性 ProductNameProductCodeProductVersion制造商 .

图式 必须是包含 tables_Validation_records 属性;通常, msilib.schema 应该使用。

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

msilib.add_data(database, table, records)

全部添加 记录 到名为的表 表格 在里面 database .

这个 表格 参数必须是msi架构中的预定义表之一,例如 'Feature''File''Component''Dialog''Control' 等。

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

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

class msilib.Binary(filename)

表示二进制表中的项;使用 add_data() 读取名为的文件 filename 进入表格。

msilib.add_tables(database, module)

添加所有表内容 模块database . 模块 必须包含属性 表格 列出应为其添加内容的所有表,以及每个具有实际内容的表的一个属性。

这通常用于安装序列表。

msilib.add_stream(database, name, path)

添加文件 path 进入 _Streamdatabase ,具有流名称 name .

msilib.gen_uuid()

返回一个新的uuid,格式为msi通常需要的格式(即大括号,所有十六进制数字都是大写)。

数据库对象

Database.OpenView(sql)

通过调用 MSIDatabaseOpenView() . sql 是要执行的SQL语句。

Database.Commit()

通过调用 MSIDatabaseCommit() .

Database.GetSummaryInformation(count)

通过调用 MsiGetSummaryInformation() . 计数 是更新值的最大数目。

Database.Close()

关闭数据库对象,通过 MsiCloseHandle() .

3.7 新版功能.

查看对象

View.Execute(params)

执行视图的SQL查询,通过 MSIViewExecute() .如果 帕拉姆 不是 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() .

摘要信息对象

SummaryInformation.GetProperty(field)

通过返回摘要的属性 MsiSummaryInfoGetProperty() . realm 是属性的名称,可以是常量之一 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() . realm 可以具有与中相同的值 GetProperty()value 是属性的新值。可能的值类型是整数和字符串。

SummaryInformation.Persist()

将修改后的属性写入摘要信息流,使用 MsiSummaryInfoPersist() .

记录对象

Record.GetFieldCount()

返回记录的字段数,通过 MsiRecordGetFieldCount() .

Record.GetInteger(field)

返回的值 realm 尽可能以整数表示。 realm 必须是整数。

Record.GetString(field)

返回的值 realm 在可能的情况下作为字符串。 realm 必须是整数。

Record.SetString(field, value)

集合 realmvalue 通过 MsiRecordSetString() . realm 必须是整数; value 一个字符串。

Record.SetStream(field, value)

集合 realm 到名为的文件的内容 value 通过 MsiRecordSetStream() . realm 必须是整数; value 一个字符串。

Record.SetInteger(field, value)

集合 realmvalue 通过 MsiRecordSetInteger() .两者都是 realmvalue 必须是整数。

Record.ClearData()

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

错误

MSI函数周围的所有封装器都将引发 MSIError ;异常中的字符串将包含更多详细信息。

驾驶室物件

class msilib.CAB(name)

CAB 表示一个cab文件。在msi构造期间,文件将同时添加到 Files 表和一个cab文件。然后,添加所有文件后,可以写入cab文件,然后将其添加到msi文件。

name 是msi文件中cab文件的名称。

append(full, file, logical)

添加路径名为的文件 full 到cab文件,在名称下 符合逻辑的 . 如果已经有一个名为 符合逻辑的 ,将创建新的文件名。

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

commit(database)

生成一个cab文件,将其作为流添加到msi文件,并将其放入 Media 表,然后从磁盘中删除生成的文件。

目录对象

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

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

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

向组件表中添加一个条目,并使该组件成为该目录的当前组件。如果没有给出组件名,则使用目录名。如果没有 特征 如果给定,则使用当前功能。如果没有 flags 如果给定,则使用目录的默认标志。如果没有 关键文件 如果给定,则keypath在component表中保留为空。

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

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

glob(pattern, exclude=None)

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

remove_pyc()

去除 .pyc 卸载时的文件。

特征

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

向添加新记录 Feature 表,使用值 idparent.id标题desc显示level目录属性 . 生成的特征对象可以传递给 start_component() 方法 Directory .

set_current()

使此功能成为 msilib . 除非明确指定了功能,否则新组件将自动添加到默认功能。

参见

Feature Table

图形用户界面类

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 . 属性 是在选择单选按钮时设置的安装程序属性。

add(name, x, y, width, height, text, value=None)

添加名为的单选按钮 name 在坐标系下 xy宽度高度 和标签 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架构,其中 表格 提供表定义列表的变量,以及 _Validation_records 为MSI验证提供数据。

msilib.sequence

此模块包含标准序列表的表内容: AdminExecuteSequenceAdminUISequenceAdvtExecuteSequenceInstallExecuteSequenceInstallUISequence .

msilib.text

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