msilib —读写 Microsoft Installer 文件

源代码: Lib/msilib/init.py


msilib支持创建 Microsoft Installer(.msi)文件。由于这些文件通常包含嵌入式“柜子”文件(.cab),因此它还公开了用于创建 CAB 文件的 API。当前未实现对读取.cab文件的支持。可能支持.msi数据库的读取。

该软件包旨在提供对.msi文件中所有表的完全访问权限,因此,它是一个相当低级的 API。该软件包的两个主要应用是distutils命令bdist_msi,以及 Python 安装程序软件包本身的创建(尽管当前使用的是msilib的不同版本)。

软件包的内容可以大致分为四个部分:低级 CAB 例程,低级 MSI 例程,高级别 MSI 例程和标准表结构。

  • msilib. FCICreate(* cabname files *)
    • 创建一个名为* cabname *的新 CAB 文件。 * files *必须是一个 Tuples 列表,每个 Tuples 包含磁盘上文件的名称以及 CAB 文件中文件的名称。

这些文件将按照它们在列表中出现的 Sequences 添加到 CAB 文件中。使用 MSZIP 压缩算法将所有文件添加到单个 CAB 文件中。

目前不公开针对 MSI 创建各个步骤的 Python 回调。

  • msilib. UuidCreate ( )

    • 返回新的唯一标识符的字符串表示形式。这包装了 Windows API 函数UuidCreate()UuidToString()
  • msilib. OpenDatabase(* path persist *)

    • pass调用 MsiOpenDatabase 返回一个新的数据库对象。 * path *是 MSI 文件的文件名; * persist *可以是常量MSIDBOPEN_CREATEDIRECTMSIDBOPEN_CREATEMSIDBOPEN_DIRECTMSIDBOPEN_READONLYMSIDBOPEN_TRANSACT之一,并且可以包含标志MSIDBOPEN_PATCHFILE。有关这些标志的含义,请参见 Microsoft 文档。根据这些标志,将打开一个现有数据库,或者创建一个新数据库。
  • msilib. CreateRecord(* count *)

    • pass调用MSICreateRecord()返回新的记录对象。 * count *是记录的字段数。
  • msilib. init_database(名称模式产品名称产品代码产品版本制造商)

    • 创建并返回一个新数据库* name ,用 schema 对其进行初始化,并设置属性 ProductName ProductCode ProductVersion Manufacturer *。
  • schema *必须是包含tables_Validation_records属性的模块对象;通常,应使用msilib.schema

该函数返回时,数据库将仅包含架构和验证记录。

  • msilib. add_data(数据库记录)
    • 将所有记录添加到数据库中名为* table *的表中。
  • table *参数必须是 MSI 模式中的 sched 义表之一,例如'Feature''File''Component''Dialog''Control'等。

  • records *应该是一个 Tuples 列表,每个 Tuples 都包含根据表的架构的记录的所有字段。对于可选字段,可以传递None

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

  • 类别 msilib. Binary(文件名)

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

    • 将所有表内容从* module 添加到 database 模块必须包含属性 tables *,该属性列出应为其添加内容的所有表,并且每个表都有一个具有实际内容的属性。

通常用于安装序列表。

  • msilib. add_stream(数据库名称路径)

    • 将文件* path 与流名称 name 一起添加到 database *的_Stream表中。
  • msilib. gen_uuid ( )

    • 以 MSI 通常要求的格式返回新的 UUID(即,用大括号括起来,且所有十六进制数字均大写)。

Database Objects

  • Database. OpenView(* sql *)

    • pass调用MSIDatabaseOpenView()返回视图对象。 * sql *是要执行的 SQL 语句。
  • Database. Commit ( )

    • pass调用MSIDatabaseCommit()提交当前事务中待处理的更改。
  • Database. GetSummaryInformation(* count *)

    • pass调用MsiGetSummaryInformation()返回新的摘要信息对象。 * count *是更新值的最大数量。
  • Database. Close ( )

    • passMsiCloseHandle()关闭数据库对象。

3.7 版中的新Function。

View Objects

  • View. Execute(* params *)

    • passMSIViewExecute()执行视图的 SQL 查询。如果* params *不是None,那么它将是一条记录,描述查询中参数标记的实际值。
  • View. GetColumnInfo(种类)

    • pass调用MsiViewGetColumnInfo()返回描述视图列的记录。 种类可以是MSICOLINFO_NAMESMSICOLINFO_TYPES
  • View. Fetch ( )

    • pass调用MsiViewFetch()返回查询的结果记录。
  • View. Modify(种类数据)

    • pass调用MsiViewModify()修改视图。 种类可以是MSIMODIFY_SEEKMSIMODIFY_REFRESHMSIMODIFY_INSERTMSIMODIFY_UPDATEMSIMODIFY_ASSIGNMSIMODIFY_REPLACEMSIMODIFY_MERGEMSIMODIFY_DELETEMSIMODIFY_INSERT_TEMPORARYMSIMODIFY_VALIDATEMSIMODIFY_VALIDATE_NEWMSIMODIFY_VALIDATE_FIELDMSIMODIFY_VALIDATE_DELETE之一。
  • data *必须是描述新数据的记录。
  • View. Close ( )
    • passMsiViewClose()关闭视图。

摘要信息对象

  • SummaryInformation. GetProperty(* field *)

    • passMsiSummaryInfoGetProperty()返回摘要的属性。 * field *是属性的名称,可以是常量PID_CODEPAGEPID_TITLEPID_SUBJECTPID_AUTHORPID_KEYWORDSPID_COMMENTSPID_TEMPLATEPID_LASTAUTHORPID_REVNUMBERPID_LASTPRINTEDPID_CREATE_DTMPID_LASTSAVE_DTMPID_PAGECOUNTPID_WORDCOUNTPID_CHARCOUNTPID_APPNAME之一PID_SECURITY
  • SummaryInformation. GetPropertyCount ( )

    • passMsiSummaryInfoGetPropertyCount()返回摘要属性的数量。
  • SummaryInformation. SetProperty(* field value *)

    • passMsiSummaryInfoSetProperty()设置属性。 * field 可以具有与GetProperty()相同的值, value *是属性的新值。可能的值类型为整数和字符串。
  • SummaryInformation. Persist ( )

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

Record Objects

  • Record. GetFieldCount ( )

    • passMsiRecordGetFieldCount()返回记录的字段数。
  • Record. GetInteger(* field *)

    • 尽可能以整数形式返回* field *的值。 * field *必须为整数。
  • Record. GetString(* field *)

    • 尽可能以字符串形式返回* field *的值。 * field *必须为整数。
  • Record. SetString(* field value *)

    • passMsiRecordSetString()将* field 设置为 value *。 * field *必须为整数; 一个字符串。
  • Record. SetStream(* field value *)

    • passMsiRecordSetStream()将* field 设置为名为 value *的文件的内容。 * field *必须为整数; 一个字符串。
  • Record. SetInteger(* field value *)

    • passMsiRecordSetInteger()将* field 设置为 value *。 * field value *都必须是整数。
  • Record. ClearData ( )

    • passMsiRecordClearData()将记录的所有字段设置为 0.

Errors

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

CAB Objects

  • 类别 msilib. CAB(名称)
    • CAB类代表一个 CAB 文件。在 MSI 构建期间,文件将同时添加到Files表和 CAB 文件中。然后,在添加完所有文件后,可以写入 CAB 文件,然后将其添加到 MSI 文件中。
  • name *是 MSI 文件中 CAB 文件的名称。
  • append(完整文件逻辑)
    • 将路径名* full 的文件添加到 CAB 文件中,名称为 logical 。如果已经有一个名为 logical *的文件,则会创建一个新文件名。

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

  • commit(数据库)
    • 生成 CAB 文件,将其作为流添加到 MSI 文件,将其放入Media表,然后从磁盘中删除生成的文件。

Directory Objects

    • class * msilib. Directory(* database cab basedir physical logic default * [,* componentflags *])
    • 在目录表中创建一个新目录。目录的每个时间点都有一个当前组件,该组件要么passstart_component()显式创建,要么在首次添加文件时隐式创建。文件将添加到当前组件以及 cab 文件中。要创建目录,需要指定基本目录对象(可以为None),物理目录的路径以及逻辑目录名。 * default *指定目录表中的 DefaultDir 插槽。 * componentflags *指定新组件获得的默认标志。
  • start_component((component = None feature = None flags = None keyfile = None uuid = None *)

    • 将一个条目添加到 Component 表中,并使该组件成为该目录的当前组件。如果未给出组件名称,则使用目录名称。如果未提供* feature ,则使用当前Function。如果未提供 flags ,则使用目录的默认标志。如果未给出 keyfile *,则 KeyPath 在 Component 表中保留为空。
  • add_file(* file src = None version = None language = None *)

    • 将文件添加到目录的当前组件,如果没有当前组件,则开始一个新文件。默认情况下,源和文件表中的文件名将相同。如果指定了* src 文件,则会相对于当前目录进行解释。 (可选)可以为“文件”表中的条目指定 version language *。
  • glob((pattern exclude = None *)

    • 按照 glob 模式中的指定,将文件列表添加到当前组件。单个文件可以在* exclude *列表中排除。
  • remove_pyc ( )

    • 卸载时删除.pyc个文件。

Features

    • 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表中。可以将生成的 Feature 对象传递给Directorystart_component()方法。
  • set_current ( )

    • 将此Function设为msilib的当前Function。除非明确指定Function,否则新组件会自动添加到默认Function。

See also

GUI classes

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

    • class * msilib. Control(* dlg name *)
    • 对话框控件的 Base Class。 * dlg 是控件所属的对话框对象, name *是控件的名称。
  • event((* event argument condition = 1 ordering = None *)

    • 在此控件的ControlEvent表中进行 Importing。
  • mapping((* event attribute *)

    • 在此控件的EventMapping表中进行 Importing。
  • condition((* action condition *)

    • 在此控件的ControlCondition表中进行 Importing。
    • 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控件。

Precomputed tables

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 表的定义以及标准安装程序操作。