msilib --- 读写 Microsoft Installer 文件¶
æº�代ç �: Lib/msilib/__init__.py
从 3.11 版起ä¸�建议使用,将在 3.13 版ä¸ç§»é™¤: msilib 模å�—已被弃用(请å�‚阅 PEP 594 了解详情)。
msilib 支�创建 Microsoft 安装程� (.msi) 文件。 由于这�文件往往包�一个嵌入的 "cabinet" 文件 (.cab),它也暴露了一个用于创建 CAB 文件的 API。 目�没有实现对读� .cab 文件的支�;对于读� .msi 数�库的支�则是�能的。
è¿™ä¸ªåŒ…çš„ç›®æ ‡æ˜¯æ��供对 .msi 文件ä¸çš„å…¨éƒ¨è¡¨çš„å®Œæ•´è®¿é—®ï¼Œå› æ¤ï¼Œå®ƒæ˜¯ä¸€ä¸ªç›¸å½“低层级的 API。 这个包的一个主è¦�应用是创建 Python 安装程åº�包本身 (尽管它目å‰�是使用ä¸�å�Œç‰ˆæœ¬çš„ msilib)。
这个包的内容å�¯ä»¥å¤§è‡´åˆ†ä¸ºå››ä¸ªéƒ¨åˆ†ï¼šä½Žå±‚级 CAB 例程ã€�低层级 MSI 例程ã€�高层级 MSI 例程以å�Šæ ‡å‡†è¡¨ç»“构。
- msilib.FCICreate(cabname, files)¶
新建一个å��为 cabname çš„ CAB 文件。 files å¿…é¡»æ˜¯ä¸€ä¸ªå…ƒç»„çš„åˆ—è¡¨ï¼Œå…¶ä¸æ¯�个元组包å�«ç£�盘文件的å��称,以å�Š CAB 文件内文件的å��称。
这些文件将按照它们在列表ä¸å‡ºçŽ°çš„é¡ºåº�è¢«æ·»åŠ åˆ° CAB 文件ä¸ã€‚ æ‰€æœ‰æ–‡ä»¶éƒ½ä¼šè¢«æ·»åŠ åˆ°å�•个 CAB 文件,使用 MSZIP 压缩算法。
ç›®å‰�没有暴露 MSI 创建的å�„个æ¥éª¤å¯¹ Python 的回调。
- msilib.UuidCreate()¶
è¿”å›žä¸€ä¸ªæ–°çš„å”¯ä¸€æ ‡è¯†ç¬¦çš„å—符串表示形å¼�。 è¿™å°�装了 Windows API 函数
UuidCreate()和UuidToString()。
- msilib.OpenDatabase(path, persist)¶
通过调用 MsiOpenDatabase �返回一个新的数�库对象。 path 为 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)¶
创建并返回一个新的数�库 name,使用 schema ��始化它,并设置属性 ProductName, ProductCode, ProductVersion 和 Manufacturer。
schema 必须是一个包�
tableså’Œ_Validation_records属性的模å�—对象;在通常情况下,msilib.schemaåº”å½“è¢«ä½¿ç”¨ã€‚æ¤æ¤å‡½æ•°è¿”回时该数æ�®åº“å°†å�ªåŒ…å�«è¡¨ç»“构和验è¯�记录。
- msilib.add_data(database, table, records)¶
将所有 records æ·»åŠ åˆ° database ä¸å��为 table 的表。
table å�‚数必须为 MSI 方案ä¸é¢„定义的表之一,å�³
'Feature','File','Component','Dialog','Control'ç‰ç‰ã€‚records 应当为一个元组的列表,其ä¸çš„æ¯�个元组都包å�«ä¸Žè¡¨ç»“æž„å¯¹åº”çš„è®°å½•çš„æ‰€æœ‰å—æ®µã€‚ 对于å�¯é€‰å—段,å�¯ä»¥ä¼ å…¥
Noneã€‚å—æ®µå€¼å�¯ä»¥ä¸ºæ•´æ•°ã€�å—符串或 Binary 类的实例。
- class msilib.Binary(filename)¶
代表 Binary 表ä¸çš„æ�¡ç›®ï¼›ä½¿ç”¨
add_data()æ�’å…¥è¿™æ ·çš„å¯¹è±¡ä¼šå°†å��为 filename 文件读入表ä¸ã€‚
- msilib.add_tables(database, module)¶
å°†æ�¥è‡ª module çš„æ‰€æœ‰è¡¨å†…å®¹æ·»åŠ åˆ° database。 module 必须包括一个列出其内容需è¦�è¢«æ·»åŠ çš„æ‰€æœ‰è¡¨çš„å±žæ€§ tables,并且æ¯�个具有实际内容的表对应一个属性。
这通常被用�安装�列表。
- msilib.add_stream(database, name, path)¶
将文件 path æ·»åŠ åˆ° database çš„
_Stream表,使用��称 name。
- msilib.gen_uuid()¶
返回一个新的 UUID,符å�ˆ MSI é€šå¸¸çš„æ ¼å¼�è¦�求(å�³å¤–åŠ èŠ±æ‹¬å�·ï¼Œä¸”所有å��å…进制数ç �å�‡ä¸ºå¤§å†™å½¢å¼�)。
��
数�对象¶
- Database.OpenView(sql)¶
通过调用
MSIDatabaseOpenView()返回一个视图对象。 sql 是è¦�执行的 SQL è¯å�¥ã€‚statement to execute.
- Database.Commit()¶
通过调用
MSIDatabaseCommit()æ��交当å‰�äº‹åŠ¡ä¸æŒ‚起的修改。
- Database.GetSummaryInformation(count)¶
通过调用
MsiGetSummaryInformation()返回一个新的概�信�对象。 count 为已更新值的最大数�。
- Database.Close()¶
通过
MsiCloseHandle()关闿•°æ�®åº“对象。在 3.7 ç‰ˆæœ¬åŠ å…¥.
视图对象¶
- View.Execute(params)¶
通过
MSIViewExecute()执行视图的 SQL 查询。 如果 params ä¸�为None,它应是一æ�¡æ��述查询ä¸å½¢å�‚å��称的实际值的记录。
- View.GetColumnInfo(kind)¶
通过调用
MsiViewGetColumnInfo()返回一��述视图的列的记录。 kind �以是MSICOLINFO_NAMES或MSICOLINFO_TYPES。
- View.Fetch()¶
通过调用
MsiViewFetch()返回查询的结果记录。
- View.Modify(kind, data)¶
通过调用
MsiViewModify()改å�˜è§†å›¾ã€‚ kind å�¯ä»¥æ˜¯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()å…³é—窗å�£ã€‚
对象总览¶
- SummaryInformation.GetProperty(field)¶
通过
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ä¸çš„一个。
- SummaryInformation.GetPropertyCount()¶
通过
MsiSummaryInfoGetPropertyCount()返回概�特�属性的数�。
- SummaryInformation.SetProperty(field, value)¶
通过
MsiSummaryInfoSetProperty()设置特å¾�属性。 field å�¯ä»¥æœ‰ä¸ŽGetProperty()相å�Œçš„值。 value 是属性的新值。 å�¯ç”¨çš„值类型有整数和å—符串。
- SummaryInformation.Persist()¶
使用
MsiSummaryInfoPersist()将已修改的特�属性写入到概�信��。
记录对象¶
- Record.GetFieldCount()¶
通过
MsiRecordGetFieldCount()è¿”å›žè®°å½•å—æ®µçš„æ•°é‡�。
- Record.GetInteger(field)¶
在�能的情况下将 field 的值以整数形�返回。 field 必须为整数。
- Record.GetString(field)¶
在å�¯èƒ½çš„æƒ…况下将 field 的值以å—符串形å¼�返回。 field 必须为整数。
- Record.SetString(field, value)¶
通过
MsiRecordSetString()å°† field 设为 value。 field 必须是一个整数;value 是一个å—符串。
- Record.SetStream(field, value)¶
通过
MsiRecordSetStream()å°† field 设为å��为 value 的文件的内容。 field 必须是一个整数;value 是一个å—符串。
- Record.SetInteger(field, value)¶
通过
MsiRecordSetInteger()将 field 设为 value。 field 和 value 必须为整数。
- 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])¶
在目录表ä¸åˆ›å»ºä¸€ä¸ªæ–°ç›®å½•。 在æ¯�个时点上对于该目录都有一个当å‰�组件,它或是通过
start_component()显å¼�åˆ›å»ºï¼Œæˆ–æ˜¯åœ¨æ–‡ä»¶é¦–æ¬¡è¢«åŠ å…¥æ—¶éš�å¼�创建。 æ–‡ä»¶ä¼šè¢«åŠ å…¥å½“å‰�ç»„ä»¶ï¼Œå¹¶è¢«åŠ å…¥åˆ° cab 文件ä¸ã€‚ è¦�创建一个目录,必须指定一个基准目录对象 (å�¯ä»¥ä¸ºNone),指å�‘物ç�†ç›®å½•的路径,以å�Šä¸€ä¸ªé€»è¾‘目录å��称。 default 指明目录表ä¸çš„ DefaultDir æ§½ä½�。 componentflags æŒ‡æ˜Žæ–°ç»„ä»¶æ‰€èŽ·å¾—çš„é»˜è®¤æ——æ ‡ã€‚- start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)¶
å�‘ç»„ä»¶è¡¨æ·»åŠ ä¸€ä¸ªæ�¡ç›®ï¼Œå¹¶å°†è¯¥ç»„件设为æ¤ç›®å½•的当å‰�组件。 如果未给出组件å��称,则将使用目录å��称。 如果未给出 feature,则将使用当å‰�特å¾�。 如果未给出 flagsï¼Œåˆ™å°†ä½¿ç”¨ç›®å½•çš„é»˜è®¤æ——æ ‡ã€‚ 如果未给出 keyfile,则组件表ä¸çš„ KeyPath å°†ä¿�æŒ�为空值。
- add_file(file, src=None, version=None, language=None)¶
å�‘目录的当å‰�ç»„ä»¶æ·»åŠ ä¸€ä¸ªæ–‡ä»¶ï¼Œå¦‚æžœæ²¡æœ‰å½“å‰�组件则会新建一个。 在默认情况下,æº�ä¸çš„æ–‡ä»¶å��和文件表将ä¿�æŒ�一致。 如果指定了 src 文件,它将被解读为相对于当å‰�目录。 作为å�¯é€‰é¡¹ï¼Œå�¯ä»¥ä¸ºæ–‡ä»¶è¡¨ä¸çš„æ�¡ç›®æŒ‡å®š version å’Œ language。
- glob(pattern, exclude=None)¶
å�‘当å‰�ç»„ä»¶æ·»åŠ ä¸€ä¸ªé€šè¿‡ glob 模å¼�指定的文件列表。 å�•个文件å�¯ä»¥åœ¨ exclude åˆ—è¡¨ä¸æŽ’é™¤ã€‚
- remove_pyc()¶
在�载时移除
.pyc文件。
相关特性¶
- 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è¡¨æ·»åŠ ä¸€æ�¡æ–°è®°å½•。 结果特å¾�对象å�¯è¢«ä¼ ç»™Directoryçš„start_component()方法。
��
GUI 类¶
msilib æ��供了一些在 MSI æ•°æ�®åº“ä¸åŒ…装 GUI 表的类。 但是,并未æ��ä¾›æ ‡å‡†ç”¨æˆ·æŽ¥å�£ã€‚
- 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。 如果 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控件。
预计算的表¶
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 è¡¨çš„å®šä¹‰ï¼Œç”¨äºŽæ ‡å‡†å®‰è£…å™¨åŠ¨ä½œã€‚