blob: 53eae65dfac0832cb883523355b8a67923f2056d [file] [log] [blame]
Georg Brandl8ec7f652007-08-15 14:28:01 +00001
2:mod:`zipimport` --- Import modules from Zip archives
3=====================================================
4
5.. module:: zipimport
6 :synopsis: support for importing Python modules from ZIP archives.
7.. moduleauthor:: Just van Rossum <just@letterror.com>
8
9
10.. versionadded:: 2.3
11
12This module adds the ability to import Python modules (:file:`\*.py`,
13:file:`\*.py[co]`) and packages from ZIP-format archives. It is usually not
14needed to use the :mod:`zipimport` module explicitly; it is automatically used
15by the builtin :keyword:`import` mechanism for ``sys.path`` items that are paths
16to ZIP archives.
17
18Typically, ``sys.path`` is a list of directory names as strings. This module
19also allows an item of ``sys.path`` to be a string naming a ZIP file archive.
20The ZIP archive can contain a subdirectory structure to support package imports,
21and a path within the archive can be specified to only import from a
22subdirectory. For example, the path :file:`/tmp/example.zip/lib/` would only
23import from the :file:`lib/` subdirectory within the archive.
24
25Any files may be present in the ZIP archive, but only files :file:`.py` and
26:file:`.py[co]` are available for import. ZIP import of dynamic modules
27(:file:`.pyd`, :file:`.so`) is disallowed. Note that if an archive only contains
28:file:`.py` files, Python will not attempt to modify the archive by adding the
29corresponding :file:`.pyc` or :file:`.pyo` file, meaning that if a ZIP archive
30doesn't contain :file:`.pyc` files, importing may be rather slow.
31
32Using the built-in :func:`reload` function will fail if called on a module
33loaded from a ZIP archive; it is unlikely that :func:`reload` would be needed,
34since this would imply that the ZIP has been altered during runtime.
35
Georg Brandl8ec7f652007-08-15 14:28:01 +000036.. seealso::
37
38 `PKZIP Application Note <http://www.pkware.com/business_and_developers/developer/appnote/>`_
39 Documentation on the ZIP file format by Phil Katz, the creator of the format and
40 algorithms used.
41
42 :pep:`0273` - Import Modules from Zip Archives
43 Written by James C. Ahlstrom, who also provided an implementation. Python 2.3
44 follows the specification in PEP 273, but uses an implementation written by Just
45 van Rossum that uses the import hooks described in PEP 302.
46
47 :pep:`0302` - New Import Hooks
48 The PEP to add the import hooks that help this module work.
49
50
Georg Brandle260ba22008-01-06 16:49:50 +000051This module defines an exception:
52
53.. exception:: ZipImportError
54
55 Exception raised by zipimporter objects. It's a subclass of :exc:`ImportError`,
56 so it can be caught as :exc:`ImportError`, too.
57
58
Georg Brandl8ec7f652007-08-15 14:28:01 +000059.. _zipimporter-objects:
60
61zipimporter Objects
62-------------------
63
Georg Brandle260ba22008-01-06 16:49:50 +000064:class:`zipimporter` is the class for importing ZIP files.
Georg Brandl8ec7f652007-08-15 14:28:01 +000065
66.. class:: zipimporter(archivepath)
67
Georg Brandle260ba22008-01-06 16:49:50 +000068 Create a new zipimporter instance. *archivepath* must be a path to a ZIP file.
Georg Brandl8ec7f652007-08-15 14:28:01 +000069 :exc:`ZipImportError` is raised if *archivepath* doesn't point to a valid ZIP
70 archive.
71
Georg Brandle260ba22008-01-06 16:49:50 +000072 *archivepath* can also contain a path within the ZIP file -- the importer
73 object will then look under that path instead of the ZIP file root. For
74 example, an *archivepath* of :file:`foo/bar.zip/lib` will look for modules
75 in the :file:`lib` directory inside the ZIP file :file:`foo/bar.zip`
76 (provided that it exists).
77
Georg Brandl8ec7f652007-08-15 14:28:01 +000078
79.. method:: zipimporter.find_module(fullname[, path])
80
81 Search for a module specified by *fullname*. *fullname* must be the fully
82 qualified (dotted) module name. It returns the zipimporter instance itself if
83 the module was found, or :const:`None` if it wasn't. The optional *path*
84 argument is ignored---it's there for compatibility with the importer protocol.
85
86
87.. method:: zipimporter.get_code(fullname)
88
89 Return the code object for the specified module. Raise :exc:`ZipImportError` if
90 the module couldn't be found.
91
92
93.. method:: zipimporter.get_data(pathname)
94
95 Return the data associated with *pathname*. Raise :exc:`IOError` if the file
96 wasn't found.
97
98
99.. method:: zipimporter.get_source(fullname)
100
101 Return the source code for the specified module. Raise :exc:`ZipImportError` if
102 the module couldn't be found, return :const:`None` if the archive does contain
103 the module, but has no source for it.
104
105
106.. method:: zipimporter.is_package(fullname)
107
108 Return True if the module specified by *fullname* is a package. Raise
109 :exc:`ZipImportError` if the module couldn't be found.
110
111
112.. method:: zipimporter.load_module(fullname)
113
114 Load the module specified by *fullname*. *fullname* must be the fully qualified
115 (dotted) module name. It returns the imported module, or raises
116 :exc:`ZipImportError` if it wasn't found.
117
118
Georg Brandle260ba22008-01-06 16:49:50 +0000119.. attribute:: zipimporter.archive
120
121 The file name of the importer's associated ZIP file.
122
123
124.. attribute:: zipimporter.prefix
125
126 The path within the ZIP file where modules are searched; see
127 :class:`zipimporter` for details.
128
Georg Brandl8ec7f652007-08-15 14:28:01 +0000129
130.. _zipimport-examples:
131
Georg Brandle260ba22008-01-06 16:49:50 +0000132Examples
133--------
134
Georg Brandl8ec7f652007-08-15 14:28:01 +0000135Here is an example that imports a module from a ZIP archive - note that the
136:mod:`zipimport` module is not explicitly used. ::
137
138 $ unzip -l /tmp/example.zip
139 Archive: /tmp/example.zip
140 Length Date Time Name
141 -------- ---- ---- ----
142 8467 11-26-02 22:30 jwzthreading.py
143 -------- -------
144 8467 1 file
145 $ ./python
146 Python 2.3 (#1, Aug 1 2003, 19:54:32)
147 >>> import sys
148 >>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path
149 >>> import jwzthreading
150 >>> jwzthreading.__file__
151 '/tmp/example.zip/jwzthreading.py'
152