On this page
35.1. msilib —读写 Microsoft Installer 文件
2.5 版的新Function。
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()
。
- 返回新的唯一标识符的字符串表示形式。这包装了 Windows API 函数
msilib.
OpenDatabase
(* path , persist *)- pass调用 MsiOpenDatabase 返回一个新的数据库对象。 * path *是 MSI 文件的文件名; * persist *可以是常量
MSIDBOPEN_CREATEDIRECT
,MSIDBOPEN_CREATE
,MSIDBOPEN_DIRECT
,MSIDBOPEN_READONLY
或MSIDBOPEN_TRANSACT
之一,并且可以包含标志MSIDBOPEN_PATCHFILE
。有关这些标志的含义,请参见 Microsoft 文档。根据这些标志,将打开一个现有数据库,或者创建一个新数据库。
- pass调用 MsiOpenDatabase 返回一个新的数据库对象。 * path *是 MSI 文件的文件名; * persist *可以是常量
msilib.
CreateRecord
(* count *)- pass调用
MSICreateRecord()
返回新的记录对象。 * count *是记录的字段数。
- pass调用
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
表中。
- 将文件* path 与流名称 name 一起添加到 database *的
msilib.
gen_uuid
( )- 以 MSI 通常要求的格式返回新的 UUID(即,用大括号括起来,且所有十六进制数字均大写)。
See also
35.1.1. 数据库对象
Database.
OpenView
(* sql *)- pass调用
MSIDatabaseOpenView()
返回视图对象。 * sql *是要执行的 SQL 语句。
- pass调用
Database.
Commit
( )- pass调用
MSIDatabaseCommit()
提交当前事务中待处理的更改。
- pass调用
Database.
GetSummaryInformation
(* count *)- pass调用
MsiGetSummaryInformation()
返回新的摘要信息对象。 * count *是更新值的最大数量。
- pass调用
35.1.2. 查看物件
View.
Execute
(* params *)- pass
MSIViewExecute()
执行视图的 SQL 查询。如果* params *不是None
,那么它将是一条记录,描述查询中参数标记的实际值。
- pass
View.
GetColumnInfo
(种类)- pass调用
MsiViewGetColumnInfo()
返回描述视图列的记录。 种类可以是MSICOLINFO_NAMES
或MSICOLINFO_TYPES
。
- pass调用
View.
Fetch
( )- pass调用
MsiViewFetch()
返回查询的结果记录。
- pass调用
View.
Modify
(种类,数据)- pass调用
MsiViewModify()
修改视图。 种类可以是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
之一。
- pass调用
- data *必须是描述新数据的记录。
View.
Close
( )- pass
MsiViewClose()
关闭视图。
- pass
35.1.3. 摘要信息对象
SummaryInformation.
GetProperty
(* field *)- pass
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
。
- pass
SummaryInformation.
GetPropertyCount
( )- pass
MsiSummaryInfoGetPropertyCount()
返回摘要属性的数量。
- pass
SummaryInformation.
SetProperty
(* field , value *)- pass
MsiSummaryInfoSetProperty()
设置属性。 * field 可以具有与GetProperty()相同的值, value *是属性的新值。可能的值类型为整数和字符串。
- pass
SummaryInformation.
Persist
( )- 使用
MsiSummaryInfoPersist()
将修改后的属性写入摘要信息流。
- 使用
See also
35.1.4. 记录对象
Record.
GetFieldCount
( )- pass
MsiRecordGetFieldCount()
返回记录的字段数。
- pass
Record.
GetInteger
(* field *)- 尽可能以整数形式返回* field *的值。 * field *必须为整数。
Record.
GetString
(* field *)- 尽可能以字符串形式返回* field *的值。 * field *必须为整数。
Record.
SetString
(* field , value *)- pass
MsiRecordSetString()
将* field 设置为 value *。 * field *必须为整数; 值一个字符串。
- pass
Record.
SetStream
(* field , value *)- pass
MsiRecordSetStream()
将* field 设置为名为 value *的文件的内容。 * field *必须为整数; 值一个字符串。
- pass
Record.
SetInteger
(* field , value *)- pass
MsiRecordSetInteger()
将* field 设置为 value *。 * field 和 value *都必须是整数。
- pass
Record.
ClearData
( )- pass
MsiRecordClearData()
将记录的所有字段设置为 0.
- pass
See also
35.1.5. Errors
所有围绕 MSI 函数的包装器均引发MSIError
;异常中的字符串将包含更多详细信息。
35.1.6. CAB 对象
- 类别
msilib.
CAB
(名称)- CAB类代表一个 CAB 文件。在 MSI 构建期间,文件将同时添加到
Files
表和 CAB 文件中。然后,在添加完所有文件后,可以写入 CAB 文件,然后将其添加到 MSI 文件中。
- CAB类代表一个 CAB 文件。在 MSI 构建期间,文件将同时添加到
- name *是 MSI 文件中 CAB 文件的名称。
append
(完整,文件,逻辑)- 将路径名* full 的文件添加到 CAB 文件中,名称为 logical 。如果已经有一个名为 logical *的文件,则会创建一个新文件名。
返回 CAB 文件中文件的索引,以及 CAB 文件中文件的新名称。
commit
(数据库)- 生成 CAB 文件,将其作为流添加到 MSI 文件,将其放入
Media
表,然后从磁盘中删除生成的文件。
- 生成 CAB 文件,将其作为流添加到 MSI 文件,将其放入
35.1.7. 目录对象
-
- class *
msilib.
Directory
(* database , cab , basedir , physical , logic , default * [,* componentflags *])
- 在目录表中创建一个新目录。目录的每个时间点都有一个当前组件,该组件要么passstart_component()显式创建,要么在首次添加文件时隐式创建。文件将添加到当前组件以及 cab 文件中。要创建目录,需要指定基本目录对象(可以为
None
),物理目录的路径以及逻辑目录名。 * default *指定目录表中的 DefaultDir 插槽。 * componentflags *指定新组件获得的默认标志。
- class *
start_component
([[* component * [,* feature * [,* flags * [,* keyfile * [,* uuid *]]]]])- 将一个条目添加到 Component 表中,并使该组件成为该目录的当前组件。如果未给出组件名称,则使用目录名称。如果未提供* feature ,则使用当前Function。如果未提供 flags ,则使用目录的默认标志。如果未给出 keyfile *,则 KeyPath 在 Component 表中保留为空。
add_file
(* file * [,* src * [,* version * [,* language *]]])- 将文件添加到目录的当前组件,如果没有当前组件,则开始一个新文件。默认情况下,源和文件表中的文件名将相同。如果指定了* src 文件,则会相对于当前目录进行解释。 (可选)可以为“文件”表中的条目指定 version 和 language *。
glob
(模式 [,排除])- 按照 glob 模式中的指定,将文件列表添加到当前组件。单个文件可以在* exclude *列表中排除。
remove_pyc
( )- 卸载时删除
.pyc
/.pyo
个文件。
- 卸载时删除
35.1.8. Features
-
- class *
msilib.
Feature
((database , id , title , desc , display * [,* level = 1 * [,* parent * [,* directory * [,* attributes = 0 *] ]]]))
- 使用值* id , parent.id , title , desc , display , level , directory 和 attributes *将新记录添加到
Feature
表中。可以将生成的 Feature 对象传递给Directory的start_component()
方法。
- class *
set_current
( )- 将此Function设为msilib的当前Function。除非明确指定Function,否则新组件会自动添加到默认Function。
See also
35.1.9. GUI 类
msilib提供了几个将 GUI 表包装在 MSI 数据库中的类。但是,没有提供标准的用户界面。使用bdist_msi创建带有用于安装 Python 软件包的用户界面的 MSI 文件。
-
- class *
msilib.
Control
(* dlg , name *)
- 对话框控件的 Base Class。 * dlg 是控件所属的对话框对象, name *是控件的名称。
- class *
event
((* event , argument * [,* condition = 1 * [,* ordering *]])- 在此控件的
ControlEvent
表中进行 Importing。
- 在此控件的
mapping
((* event , attribute *)- 在此控件的
EventMapping
表中进行 Importing。
- 在此控件的
condition
((* action , condition *)- 在此控件的
ControlCondition
表中进行 Importing。
- 在此控件的
-
- class *
msilib.
RadioButtonGroup
(* dlg , name , property *)
- 创建一个名为* name *的单选按钮控件。 * property *是在选择单选按钮时设置的安装程序属性。
- class *
add
((* name , x , y , width , height , text * [,* value *])- 向组中添加一个名为* name 的单选按钮,其坐标为 x , y , width , height ,并带有标签 text 。如果Ellipsis value ,则默认为 name *。
-
- class *
msilib.
Dialog
(* db , name , x , y , w , h , attr , title , first , default , cancel *)
- 返回一个新的Dialog对象。将在
Dialog
表中创建一个条目,其中包含指定的坐标,对话框属性,标题,第一个控件的名称,默认控件和取消控件。
- class *
control
((* name , type , x , y , width , height , attributes , property , text , control_next , help *)- 返回一个新的Control对象。
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 ,- 添加并返回
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
控件。
- 添加并返回
See also
35.1.10. 预计算表
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 表的定义以及标准安装程序操作。