msilib
msilib - 读取和写入Microsoft Installer文件
2.5版本中的新功能。
msilib支持创建Microsoft Installer(.msi)文件。 因为这些文件通常包含一个嵌入式“cabinet”文件(.cab),所以它还公开了一个API来创建CAB文件。 读取.cab文件的支持目前尚未实施; 读取对.msi数据库的支持是可能的。
这个包旨在提供对.msi文件中所有表的完整访问,因此它是一个相当低级的API。 该软件包的两个主要应用程序是distutils命令bdist_msi,以及创建Python安装程序包本身(尽管它目前使用不同版本的msilib)。
包内容大致可以分为四个部分:低级CAB例程,低级MSI例程,高级MSI例程和标准表结构。
msilib.FCICreate(cabname, files)
创建一个名为cabname
的新CAB文件
。文件
必须是元组列表,每个元组包含磁盘上文件
的名称和CAB文件
内的文件
名称。
这些文件按照它们出现在列表中的顺序添加到CAB文件中。使用MSZIP压缩算法将所有文件添加到单个CAB文件中。
针对MSI创建的各个步骤的Python回调函数目前尚未公开。
msilib.UuidCreate()
返回新唯一标识符的字符串表示形式。这包装Windows API函数UuidCreate()
和UuidToString()
。
msilib.OpenDatabase(path, persist)
通过调用MsiOpenDatabase返回一个新的数据库对象。 路径是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)
创建并返回一个新的数据库名称
,使用模式
初始化它,并设置属性ProductName
,ProductCode
,ProductVersion
和Manufacturer
。
模式必须是包含表和_Validation_records属性的模块对象; 通常应使用msilib.schema。
该函数返回时,数据库将只包含模式和验证记录。
msilib.add_data(database, table, records)
将所有记录
添加到数据库
中名为table的表
中。
所述表
参数必须是在MSI模式中的预定义的表中的一个,例如'Feature'
,'File'
,'Component'
,'Dialog'
,'Control'
,等。
记录
应该是一个元组列表,每个元组包含根据表的模式记录的所有字段。对于可选字段,None
可以通过。
字段值可以是int或long数字,字符串或Binary类的实例。
class msilib.Binary(filename)
代表二进制表中的条目; 插入这样一个对象使用add_data()
读取名为文件名的文件
到表中。
msilib.add_tables(database, module)
将所有表
格内容从模块
添加到数据库
。模块
必须包含一个属性表
,其中列出了应为其添加内容的所有表
以及每个具有实际内容的表
的一个属性。
这通常用于安装序列表。
msilib.add_stream(database, name, path)
使用流名称将文件路径添加到数据库的_Stream表中。
msilib.gen_uuid()
返回一个新的UUID,格式为MSI通常要求的格式(例如花括号,所有的十六进制都是大写)。
扩展内容
FCICreateFile UuidCreate UuidToString
1.数据库对象
Database.OpenView(sql)
通过调用返回一个视图对象MSIDatabaseOpenView()
。sql
是要执行的SQL语句。
Database.Commit()
通过调用MSIDatabaseCommit()提交当前事务中的挂起更改。
Database.GetSummaryInformation(count)
通过调用MsiGetSummaryInformation()返回一个新的摘要信息对象。 count是更新值的最大数量。
扩展内容
MSIDatabaseOpenView MSIDatabaseCommit MSIGetSummaryInformation
2.查看对象
View.Execute(params)
通过MSIViewExecute()执行视图的SQL查询。 如果params不是None,它是描述查询中参数标记的实际值的记录。
View.GetColumnInfo(kind)
通过调用MsiViewGetColumnInfo()返回描述视图的列的记录。 kind可以是MSICOLINFO_NAMES或MSICOLINFO_TYPES。
View.Fetch()
通过调用MsiViewFetch()返回查询的结果记录。
View.Modify(kind, data)
通过调用修改视图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
。
data
必须是描述新数据的记录。
View.Close()
关闭视图,通过MsiViewClose()
。
扩展内容
MsiViewExecute MSIViewGetColumnInfo MsiViewFetch MsiViewModify MsiViewClose
3.摘要信息对象
SummaryInformation.GetProperty(field)
通过返回摘要的属性MsiSummaryInfoGetProperty()
。字段
是属性的名称,并且可以是一个常量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()
。字段
可以具有与in相同的值GetProperty()
,value
是该属性的新值。可能的值类型是整数和字符串。
SummaryInformation.Persist()
使用修改后的属性写入摘要信息流 MsiSummaryInfoPersist()
。
扩展内容
MsiSummaryInfoGetProperty MsiSummaryInfoGetPropertyCount MsiSummaryInfoSetProperty MsiSummaryInfoPersist
4.记录对象
Record.GetFieldCount()
通过MsiRecordGetFieldCount()返回记录的字段数。
Record.GetInteger(field)
尽可能以整数形式返回字段
的值。字段
必须是整数。
Record.GetString(field)
尽可能将字段
的值作为字符串返回。字段
必须是整数。
Record.SetString(field, value)
通过MsiRecordSetString()将字段设置为值。 字段必须是整数; 值一个字符串。
Record.SetStream(field, value)
将字段
设置为文件名为value
的内容,直到MsiRecordSetStream()
。字段
必须是整数; 值
一个字符串。
Record.SetInteger(field, value)
通过MsiRecordSetInteger()将字段设置为值。 字段和值都必须是整数。
Record.ClearData()
通过MsiRecordClearData()将记录的所有字段设置为0。
扩展内容
MsiRecordGetFieldCount MsiRecordSetString MsiRecordSetStream MsiRecordSetInteger MsiRecordClear
5.错误
MSI功能的所有包装都会增加MsiError
; 异常中的字符串将包含更多细节。
6. CAB对象
class msilib.CAB(name)
CAB类代表一个CAB文件。 在MSI构建过程中,文件将同时添加到Files表格和CAB文件中。 然后,当添加完所有文件后,可以编写CAB文件,然后将其添加到MSI文件中。
name
是MSI文件中CAB文件的名称。
append(full, file, logical)
添加与路径的文件完整
的CAB文件,名称下的逻辑
。如果已经有一个名为logical
的文件,则会创建一个新的文件名。
返回CAB文件中的文件的索引以及CAB文件内的文件的新名称。
commit(database)
生成CAB文件,将其作为流添加到MSI文件,将其放入媒体表中,并从磁盘中移除生成的文件。
7.目录对象
class msilib.Directory(database, cab, basedir, physical, logical, default[, componentflags])
在目录表中创建一个新的目录。 目录中每个时间点都有一个当前组件,可以通过start_component()明确创建,也可以在第一次添加文件时隐式创建。 文件被添加到当前组件中,并被添加到cab文件中。 要创建目录,需要指定一个基本目录对象(可以是None),物理目录的路径和逻辑目录名称。 default指定目录表中的DefaultDir插槽。 componentflags指定新组件获取的默认标志。
start_component([component[, feature[, flags[, keyfile[, uuid]]]]])
将一个条目添加到Component表中,并将此组件作为此目录的当前组件。如果没有给出组件名称,则使用目录名称。如果没有功能
被赋予,则使用当前功能
。如果没有标志
给出,将使用目录的缺省标志
。如果没有给出密钥文件
,KeyPath在Component表中保留为空。
add_file(file[, src[, version[, language]]])
将文件添加到目录的当前组件,如果没有当前组件,则启动一个新文件。默认情况下,源文件和文件表中的文件名称是相同的。如果指定了src
文件,则会相对于当前目录进行解释。或者,可以为File表中的条目指定版本
和语言
。
glob(pattern[, exclude])
按照glob模式中的指定将文件列表添加到当前组件。排除
列表中可以排除单个文件。
remove_pyc()
在卸载时删除.pyc
/ .pyo
文件。
扩展内容
目录表 文件表 组件表 FeatureComponents表
8.特点
class msilib.Feature(database, id, title, desc, display[, level=1[, parent[, directory[, attributes=0]]]])
使用值id,parent.id,标题,desc,显示,级别,目录和属性向Feature表添加新记录。 生成的要素对象可以传递给Directory的start_component()方法。
set_current()
使此功能成为msilib的当前功能。 新组件会自动添加到默认功能中,除非明确指定了功能。
扩展内容
9. GUI类
msilib提供了几个将GUI表包装在MSI数据库中的类。 但是,没有提供标准的用户界面; 使用bdist_msi创建带用户界面的MSI文件来安装Python包。
class msilib.Control(dlg, name)
对话框控件的基类。dlg
是控件所属的对话框对象,name
是控件的名称。
event(event, argument[, condition=1[, ordering]])
ControlEvent
为此控件输入表格。
mapping(event, attribute)
EventMapping
为此控件输入表格。
condition(action, condition)
ControlCondition
为此控件输入表格。
class msilib.RadioButtonGroup(dlg, name, property)
创建一个名为name
的单选按钮控件。属性
是选择单选按钮时设置的安装程序属性。
add(name, x, y, width, height, text[, value])
将名为name
的单选按钮添加到组中,坐标为x
,y
,宽度
,高度
和标签文本
。如果值
被省略,则默认为名称
。
class msilib.Dialog(db, name, x, y, w, h, attr, title, first, default, cancel)
返回一个新的Dialog对象。 使用指定的坐标,对话框属性,标题,第一个,默认和取消控件的名称,创建对话框表中的条目。
control(name, type, x, y, width, height, attributes, property, text, control_next, help)
返回一个新的控制对象。 控制表中的条目由指定的参数构成。
这是一种通用的方法; 对于特定的类型,提供了专门的方法。
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
控件。
扩展内容
对话框表 控制表 控制类型 ControlCondition表 ControlEvent表 EventMapping表 RadioButton表
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表的定义。