Home | History | Annotate | Download | only in library
      1 :mod:`msilib` --- Read and write Microsoft Installer files
      2 ==========================================================
      3 
      4 .. module:: msilib
      5    :platform: Windows
      6    :synopsis: Creation of Microsoft Installer files, and CAB files.
      7 
      8 .. moduleauthor:: Martin v. Lwis <martin (a] v.loewis.de>
      9 .. sectionauthor:: Martin v. Lwis <martin (a] v.loewis.de>
     10 
     11 **Source code:** :source:`Lib/msilib/__init__.py`
     12 
     13 .. index:: single: msi
     14 
     15 --------------
     16 
     17 The :mod:`msilib` supports the creation of Microsoft Installer (``.msi``) files.
     18 Because these files often contain an embedded "cabinet" file (``.cab``), it also
     19 exposes an API to create CAB files. Support for reading ``.cab`` files is
     20 currently not implemented; read support for the ``.msi`` database is possible.
     21 
     22 This package aims to provide complete access to all tables in an ``.msi`` file,
     23 therefore, it is a fairly low-level API. Two primary applications of this
     24 package are the :mod:`distutils` command ``bdist_msi``, and the creation of
     25 Python installer package itself (although that currently uses a different
     26 version of ``msilib``).
     27 
     28 The package contents can be roughly split into four parts: low-level CAB
     29 routines, low-level MSI routines, higher-level MSI routines, and standard table
     30 structures.
     31 
     32 
     33 .. function:: FCICreate(cabname, files)
     34 
     35    Create a new CAB file named *cabname*. *files* must be a list of tuples, each
     36    containing the name of the file on disk, and the name of the file inside the CAB
     37    file.
     38 
     39    The files are added to the CAB file in the order they appear in the list. All
     40    files are added into a single CAB file, using the MSZIP compression algorithm.
     41 
     42    Callbacks to Python for the various steps of MSI creation are currently not
     43    exposed.
     44 
     45 
     46 .. function:: UuidCreate()
     47 
     48    Return the string representation of a new unique identifier. This wraps the
     49    Windows API functions :c:func:`UuidCreate` and :c:func:`UuidToString`.
     50 
     51 
     52 .. function:: OpenDatabase(path, persist)
     53 
     54    Return a new database object by calling MsiOpenDatabase.   *path* is the file
     55    name of the MSI file; *persist* can be one of the constants
     56    ``MSIDBOPEN_CREATEDIRECT``, ``MSIDBOPEN_CREATE``, ``MSIDBOPEN_DIRECT``,
     57    ``MSIDBOPEN_READONLY``, or ``MSIDBOPEN_TRANSACT``, and may include the flag
     58    ``MSIDBOPEN_PATCHFILE``. See the Microsoft documentation for the meaning of
     59    these flags; depending on the flags, an existing database is opened, or a new
     60    one created.
     61 
     62 
     63 .. function:: CreateRecord(count)
     64 
     65    Return a new record object by calling :c:func:`MSICreateRecord`. *count* is the
     66    number of fields of the record.
     67 
     68 
     69 .. function:: init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)
     70 
     71    Create and return a new database *name*, initialize it with *schema*, and set
     72    the properties *ProductName*, *ProductCode*, *ProductVersion*, and
     73    *Manufacturer*.
     74 
     75    *schema* must be a module object containing ``tables`` and
     76    ``_Validation_records`` attributes; typically, :mod:`msilib.schema` should be
     77    used.
     78 
     79    The database will contain just the schema and the validation records when this
     80    function returns.
     81 
     82 
     83 .. function:: add_data(database, table, records)
     84 
     85    Add all *records* to the table named *table* in *database*.
     86 
     87    The *table* argument must be one of the predefined tables in the MSI schema,
     88    e.g. ``'Feature'``, ``'File'``, ``'Component'``, ``'Dialog'``, ``'Control'``,
     89    etc.
     90 
     91    *records* should be a list of tuples, each one containing all fields of a
     92    record according to the schema of the table.  For optional fields,
     93    ``None`` can be passed.
     94 
     95    Field values can be ints, strings, or instances of the Binary class.
     96 
     97 
     98 .. class:: Binary(filename)
     99 
    100    Represents entries in the Binary table; inserting such an object using
    101    :func:`add_data` reads the file named *filename* into the table.
    102 
    103 
    104 .. function:: add_tables(database, module)
    105 
    106    Add all table content from *module* to *database*. *module* must contain an
    107    attribute *tables* listing all tables for which content should be added, and one
    108    attribute per table that has the actual content.
    109 
    110    This is typically used to install the sequence tables.
    111 
    112 
    113 .. function:: add_stream(database, name, path)
    114 
    115    Add the file *path* into the ``_Stream`` table of *database*, with the stream
    116    name *name*.
    117 
    118 
    119 .. function:: gen_uuid()
    120 
    121    Return a new UUID, in the format that MSI typically requires (i.e. in curly
    122    braces, and with all hexdigits in upper-case).
    123 
    124 
    125 .. seealso::
    126 
    127    `FCICreateFile <https://msdn.microsoft.com/library?url=/library/en-us/devnotes/winprog/fcicreate.asp>`_
    128    `UuidCreate <https://msdn.microsoft.com/library?url=/library/en-us/rpc/rpc/uuidcreate.asp>`_
    129    `UuidToString <https://msdn.microsoft.com/library?url=/library/en-us/rpc/rpc/uuidtostring.asp>`_
    130 
    131 .. _database-objects:
    132 
    133 Database Objects
    134 ----------------
    135 
    136 
    137 .. method:: Database.OpenView(sql)
    138 
    139    Return a view object, by calling :c:func:`MSIDatabaseOpenView`. *sql* is the SQL
    140    statement to execute.
    141 
    142 
    143 .. method:: Database.Commit()
    144 
    145    Commit the changes pending in the current transaction, by calling
    146    :c:func:`MSIDatabaseCommit`.
    147 
    148 
    149 .. method:: Database.GetSummaryInformation(count)
    150 
    151    Return a new summary information object, by calling
    152    :c:func:`MsiGetSummaryInformation`.  *count* is the maximum number of updated
    153    values.
    154 
    155 
    156 .. seealso::
    157 
    158    `MSIDatabaseOpenView <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msidatabaseopenview.asp>`_
    159    `MSIDatabaseCommit <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msidatabasecommit.asp>`_
    160    `MSIGetSummaryInformation <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msigetsummaryinformation.asp>`_
    161 
    162 .. _view-objects:
    163 
    164 View Objects
    165 ------------
    166 
    167 
    168 .. method:: View.Execute(params)
    169 
    170    Execute the SQL query of the view, through :c:func:`MSIViewExecute`. If
    171    *params* is not ``None``, it is a record describing actual values of the
    172    parameter tokens in the query.
    173 
    174 
    175 .. method:: View.GetColumnInfo(kind)
    176 
    177    Return a record describing the columns of the view, through calling
    178    :c:func:`MsiViewGetColumnInfo`. *kind* can be either ``MSICOLINFO_NAMES`` or
    179    ``MSICOLINFO_TYPES``.
    180 
    181 
    182 .. method:: View.Fetch()
    183 
    184    Return a result record of the query, through calling :c:func:`MsiViewFetch`.
    185 
    186 
    187 .. method:: View.Modify(kind, data)
    188 
    189    Modify the view, by calling :c:func:`MsiViewModify`. *kind* can be one of
    190    ``MSIMODIFY_SEEK``, ``MSIMODIFY_REFRESH``, ``MSIMODIFY_INSERT``,
    191    ``MSIMODIFY_UPDATE``, ``MSIMODIFY_ASSIGN``, ``MSIMODIFY_REPLACE``,
    192    ``MSIMODIFY_MERGE``, ``MSIMODIFY_DELETE``, ``MSIMODIFY_INSERT_TEMPORARY``,
    193    ``MSIMODIFY_VALIDATE``, ``MSIMODIFY_VALIDATE_NEW``,
    194    ``MSIMODIFY_VALIDATE_FIELD``, or ``MSIMODIFY_VALIDATE_DELETE``.
    195 
    196    *data* must be a record describing the new data.
    197 
    198 
    199 .. method:: View.Close()
    200 
    201    Close the view, through :c:func:`MsiViewClose`.
    202 
    203 
    204 .. seealso::
    205 
    206    `MsiViewExecute <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msiviewexecute.asp>`_
    207    `MSIViewGetColumnInfo <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msiviewgetcolumninfo.asp>`_
    208    `MsiViewFetch <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msiviewfetch.asp>`_
    209    `MsiViewModify <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msiviewmodify.asp>`_
    210    `MsiViewClose <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msiviewclose.asp>`_
    211 
    212 .. _summary-objects:
    213 
    214 Summary Information Objects
    215 ---------------------------
    216 
    217 
    218 .. method:: SummaryInformation.GetProperty(field)
    219 
    220    Return a property of the summary, through :c:func:`MsiSummaryInfoGetProperty`.
    221    *field* is the name of the property, and can be one of the constants
    222    ``PID_CODEPAGE``, ``PID_TITLE``, ``PID_SUBJECT``, ``PID_AUTHOR``,
    223    ``PID_KEYWORDS``, ``PID_COMMENTS``, ``PID_TEMPLATE``, ``PID_LASTAUTHOR``,
    224    ``PID_REVNUMBER``, ``PID_LASTPRINTED``, ``PID_CREATE_DTM``,
    225    ``PID_LASTSAVE_DTM``, ``PID_PAGECOUNT``, ``PID_WORDCOUNT``, ``PID_CHARCOUNT``,
    226    ``PID_APPNAME``, or ``PID_SECURITY``.
    227 
    228 
    229 .. method:: SummaryInformation.GetPropertyCount()
    230 
    231    Return the number of summary properties, through
    232    :c:func:`MsiSummaryInfoGetPropertyCount`.
    233 
    234 
    235 .. method:: SummaryInformation.SetProperty(field, value)
    236 
    237    Set a property through :c:func:`MsiSummaryInfoSetProperty`. *field* can have the
    238    same values as in :meth:`GetProperty`, *value* is the new value of the property.
    239    Possible value types are integer and string.
    240 
    241 
    242 .. method:: SummaryInformation.Persist()
    243 
    244    Write the modified properties to the summary information stream, using
    245    :c:func:`MsiSummaryInfoPersist`.
    246 
    247 
    248 .. seealso::
    249 
    250    `MsiSummaryInfoGetProperty <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msisummaryinfogetproperty.asp>`_
    251    `MsiSummaryInfoGetPropertyCount <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msisummaryinfogetpropertycount.asp>`_
    252    `MsiSummaryInfoSetProperty <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msisummaryinfosetproperty.asp>`_
    253    `MsiSummaryInfoPersist <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msisummaryinfopersist.asp>`_
    254 
    255 .. _record-objects:
    256 
    257 Record Objects
    258 --------------
    259 
    260 
    261 .. method:: Record.GetFieldCount()
    262 
    263    Return the number of fields of the record, through
    264    :c:func:`MsiRecordGetFieldCount`.
    265 
    266 
    267 .. method:: Record.GetInteger(field)
    268 
    269    Return the value of *field* as an integer where possible.  *field* must
    270    be an integer.
    271 
    272 
    273 .. method:: Record.GetString(field)
    274 
    275    Return the value of *field* as a string where possible.  *field* must
    276    be an integer.
    277 
    278 
    279 .. method:: Record.SetString(field, value)
    280 
    281    Set *field* to *value* through :c:func:`MsiRecordSetString`. *field* must be an
    282    integer; *value* a string.
    283 
    284 
    285 .. method:: Record.SetStream(field, value)
    286 
    287    Set *field* to the contents of the file named *value*, through
    288    :c:func:`MsiRecordSetStream`. *field* must be an integer; *value* a string.
    289 
    290 
    291 .. method:: Record.SetInteger(field, value)
    292 
    293    Set *field* to *value* through :c:func:`MsiRecordSetInteger`. Both *field* and
    294    *value* must be an integer.
    295 
    296 
    297 .. method:: Record.ClearData()
    298 
    299    Set all fields of the record to 0, through :c:func:`MsiRecordClearData`.
    300 
    301 
    302 .. seealso::
    303 
    304    `MsiRecordGetFieldCount <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msirecordgetfieldcount.asp>`_
    305    `MsiRecordSetString <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msirecordsetstring.asp>`_
    306    `MsiRecordSetStream <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msirecordsetstream.asp>`_
    307    `MsiRecordSetInteger <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msirecordsetinteger.asp>`_
    308    `MsiRecordClear <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/msirecordclear.asp>`_
    309 
    310 .. _msi-errors:
    311 
    312 Errors
    313 ------
    314 
    315 All wrappers around MSI functions raise :exc:`MsiError`; the string inside the
    316 exception will contain more detail.
    317 
    318 
    319 .. _cab:
    320 
    321 CAB Objects
    322 -----------
    323 
    324 
    325 .. class:: CAB(name)
    326 
    327    The class :class:`CAB` represents a CAB file. During MSI construction, files
    328    will be added simultaneously to the ``Files`` table, and to a CAB file. Then,
    329    when all files have been added, the CAB file can be written, then added to the
    330    MSI file.
    331 
    332    *name* is the name of the CAB file in the MSI file.
    333 
    334 
    335    .. method:: append(full, file, logical)
    336 
    337       Add the file with the pathname *full* to the CAB file, under the name
    338       *logical*.  If there is already a file named *logical*, a new file name is
    339       created.
    340 
    341       Return the index of the file in the CAB file, and the new name of the file
    342       inside the CAB file.
    343 
    344 
    345    .. method:: commit(database)
    346 
    347       Generate a CAB file, add it as a stream to the MSI file, put it into the
    348       ``Media`` table, and remove the generated file from the disk.
    349 
    350 
    351 .. _msi-directory:
    352 
    353 Directory Objects
    354 -----------------
    355 
    356 
    357 .. class:: Directory(database, cab, basedir, physical,  logical, default, [componentflags])
    358 
    359    Create a new directory in the Directory table. There is a current component at
    360    each point in time for the directory, which is either explicitly created through
    361    :meth:`start_component`, or implicitly when files are added for the first time.
    362    Files are added into the current component, and into the cab file.  To create a
    363    directory, a base directory object needs to be specified (can be ``None``), the
    364    path to the physical directory, and a logical directory name.  *default*
    365    specifies the DefaultDir slot in the directory table. *componentflags* specifies
    366    the default flags that new components get.
    367 
    368 
    369    .. method:: start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)
    370 
    371       Add an entry to the Component table, and make this component the current
    372       component for this directory. If no component name is given, the directory
    373       name is used. If no *feature* is given, the current feature is used. If no
    374       *flags* are given, the directory's default flags are used. If no *keyfile*
    375       is given, the KeyPath is left null in the Component table.
    376 
    377 
    378    .. method:: add_file(file, src=None, version=None, language=None)
    379 
    380       Add a file to the current component of the directory, starting a new one
    381       if there is no current component. By default, the file name in the source
    382       and the file table will be identical. If the *src* file is specified, it
    383       is interpreted relative to the current directory. Optionally, a *version*
    384       and a *language* can be specified for the entry in the File table.
    385 
    386 
    387    .. method:: glob(pattern, exclude=None)
    388 
    389       Add a list of files to the current component as specified in the glob
    390       pattern.  Individual files can be excluded in the *exclude* list.
    391 
    392 
    393    .. method:: remove_pyc()
    394 
    395       Remove ``.pyc``/``.pyo`` files on uninstall.
    396 
    397 
    398 .. seealso::
    399 
    400    `Directory Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/directory_table.asp>`_
    401    `File Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/file_table.asp>`_
    402    `Component Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/component_table.asp>`_
    403    `FeatureComponents Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/featurecomponents_table.asp>`_
    404 
    405 .. _features:
    406 
    407 Features
    408 --------
    409 
    410 
    411 .. class:: Feature(db, id, title, desc, display, level=1, parent=None, directory=None,  attributes=0)
    412 
    413    Add a new record to the ``Feature`` table, using the values *id*, *parent.id*,
    414    *title*, *desc*, *display*, *level*, *directory*, and *attributes*. The
    415    resulting feature object can be passed to the :meth:`start_component` method of
    416    :class:`Directory`.
    417 
    418 
    419    .. method:: set_current()
    420 
    421       Make this feature the current feature of :mod:`msilib`. New components are
    422       automatically added to the default feature, unless a feature is explicitly
    423       specified.
    424 
    425 
    426 .. seealso::
    427 
    428    `Feature Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/feature_table.asp>`_
    429 
    430 .. _msi-gui:
    431 
    432 GUI classes
    433 -----------
    434 
    435 :mod:`msilib` provides several classes that wrap the GUI tables in an MSI
    436 database. However, no standard user interface is provided; use
    437 :mod:`~distutils.command.bdist_msi` to create MSI files with a user-interface
    438 for installing Python packages.
    439 
    440 
    441 .. class:: Control(dlg, name)
    442 
    443    Base class of the dialog controls. *dlg* is the dialog object the control
    444    belongs to, and *name* is the control's name.
    445 
    446 
    447    .. method:: event(event, argument, condition=1, ordering=None)
    448 
    449       Make an entry into the ``ControlEvent`` table for this control.
    450 
    451 
    452    .. method:: mapping(event, attribute)
    453 
    454       Make an entry into the ``EventMapping`` table for this control.
    455 
    456 
    457    .. method:: condition(action, condition)
    458 
    459       Make an entry into the ``ControlCondition`` table for this control.
    460 
    461 
    462 .. class:: RadioButtonGroup(dlg, name, property)
    463 
    464    Create a radio button control named *name*. *property* is the installer property
    465    that gets set when a radio button is selected.
    466 
    467 
    468    .. method:: add(name, x, y, width, height, text, value=None)
    469 
    470       Add a radio button named *name* to the group, at the coordinates *x*, *y*,
    471       *width*, *height*, and with the label *text*. If *value* is ``None``, it
    472       defaults to *name*.
    473 
    474 
    475 .. class:: Dialog(db, name, x, y, w, h, attr, title, first,  default, cancel)
    476 
    477    Return a new :class:`Dialog` object. An entry in the ``Dialog`` table is made,
    478    with the specified coordinates, dialog attributes, title, name of the first,
    479    default, and cancel controls.
    480 
    481 
    482    .. method:: control(name, type, x, y, width, height,  attributes, property, text, control_next, help)
    483 
    484       Return a new :class:`Control` object. An entry in the ``Control`` table is
    485       made with the specified parameters.
    486 
    487       This is a generic method; for specific types, specialized methods are
    488       provided.
    489 
    490 
    491    .. method:: text(name, x, y, width, height, attributes, text)
    492 
    493       Add and return a ``Text`` control.
    494 
    495 
    496    .. method:: bitmap(name, x, y, width, height, text)
    497 
    498       Add and return a ``Bitmap`` control.
    499 
    500 
    501    .. method:: line(name, x, y, width, height)
    502 
    503       Add and return a ``Line`` control.
    504 
    505 
    506    .. method:: pushbutton(name, x, y, width, height, attributes,  text, next_control)
    507 
    508       Add and return a ``PushButton`` control.
    509 
    510 
    511    .. method:: radiogroup(name, x, y, width, height,  attributes, property, text, next_control)
    512 
    513       Add and return a ``RadioButtonGroup`` control.
    514 
    515 
    516    .. method:: checkbox(name, x, y, width, height,  attributes, property, text, next_control)
    517 
    518       Add and return a ``CheckBox`` control.
    519 
    520 
    521 .. seealso::
    522 
    523    `Dialog Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/dialog_table.asp>`_
    524    `Control Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/control_table.asp>`_
    525    `Control Types <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/controls.asp>`_
    526    `ControlCondition Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/controlcondition_table.asp>`_
    527    `ControlEvent Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/controlevent_table.asp>`_
    528    `EventMapping Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/eventmapping_table.asp>`_
    529    `RadioButton Table <https://msdn.microsoft.com/library?url=/library/en-us/msi/setup/radiobutton_table.asp>`_
    530 
    531 .. _msi-tables:
    532 
    533 Precomputed tables
    534 ------------------
    535 
    536 :mod:`msilib` provides a few subpackages that contain only schema and table
    537 definitions. Currently, these definitions are based on MSI version 2.0.
    538 
    539 
    540 .. data:: schema
    541 
    542    This is the standard MSI schema for MSI 2.0, with the *tables* variable
    543    providing a list of table definitions, and *_Validation_records* providing the
    544    data for MSI validation.
    545 
    546 
    547 .. data:: sequence
    548 
    549    This module contains table contents for the standard sequence tables:
    550    *AdminExecuteSequence*, *AdminUISequence*, *AdvtExecuteSequence*,
    551    *InstallExecuteSequence*, and *InstallUISequence*.
    552 
    553 
    554 .. data:: text
    555 
    556    This module contains definitions for the UIText and ActionText tables, for the
    557    standard installer actions.
    558