292 lines
12 KiB
TeX
292 lines
12 KiB
TeX
\section{\module{imp} ---
|
|
Access the \keyword{import} internals}
|
|
|
|
\declaremodule{builtin}{imp}
|
|
\modulesynopsis{Access the implementation of the \keyword{import} statement.}
|
|
|
|
|
|
This\stindex{import} module provides an interface to the mechanisms
|
|
used to implement the \keyword{import} statement. It defines the
|
|
following constants and functions:
|
|
|
|
|
|
\begin{funcdesc}{get_magic}{}
|
|
\indexii{file}{byte-code}
|
|
Return the magic string value used to recognize byte-compiled code
|
|
files (\file{.pyc} files). (This value may be different for each
|
|
Python version.)
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{get_suffixes}{}
|
|
Return a list of triples, each describing a particular type of module.
|
|
Each triple has the form \code{(\var{suffix}, \var{mode},
|
|
\var{type})}, where \var{suffix} is a string to be appended to the
|
|
module name to form the filename to search for, \var{mode} is the mode
|
|
string to pass to the built-in \function{open()} function to open the
|
|
file (this can be \code{'r'} for text files or \code{'rb'} for binary
|
|
files), and \var{type} is the file type, which has one of the values
|
|
\constant{PY_SOURCE}, \constant{PY_COMPILED}, or
|
|
\constant{C_EXTENSION}, described below.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{find_module}{name\optional{, path}}
|
|
Try to find the module \var{name} on the search path \var{path}. If
|
|
\var{path} is a list of directory names, each directory is searched
|
|
for files with any of the suffixes returned by \function{get_suffixes()}
|
|
above. Invalid names in the list are silently ignored (but all list
|
|
items must be strings). If \var{path} is omitted or \code{None}, the
|
|
list of directory names given by \code{sys.path} is searched, but
|
|
first it searches a few special places: it tries to find a built-in
|
|
module with the given name (\constant{C_BUILTIN}), then a frozen module
|
|
(\constant{PY_FROZEN}), and on some systems some other places are looked
|
|
in as well (on the Mac, it looks for a resource (\constant{PY_RESOURCE});
|
|
on Windows, it looks in the registry which may point to a specific
|
|
file).
|
|
|
|
If search is successful, the return value is a triple
|
|
\code{(\var{file}, \var{pathname}, \var{description})} where
|
|
\var{file} is an open file object positioned at the beginning,
|
|
\var{pathname} is the pathname of the
|
|
file found, and \var{description} is a triple as contained in the list
|
|
returned by \function{get_suffixes()} describing the kind of module found.
|
|
If the module does not live in a file, the returned \var{file} is
|
|
\code{None}, \var{filename} is the empty string, and the
|
|
\var{description} tuple contains empty strings for its suffix and
|
|
mode; the module type is as indicate in parentheses above. If the
|
|
search is unsuccessful, \exception{ImportError} is raised. Other
|
|
exceptions indicate problems with the arguments or environment.
|
|
|
|
This function does not handle hierarchical module names (names
|
|
containing dots). In order to find \var{P}.\var{M}, that is, submodule
|
|
\var{M} of package \var{P}, use \function{find_module()} and
|
|
\function{load_module()} to find and load package \var{P}, and then use
|
|
\function{find_module()} with the \var{path} argument set to
|
|
\code{\var{P}.__path__}. When \var{P} itself has a dotted name, apply
|
|
this recipe recursively.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{load_module}{name, file, filename, description}
|
|
Load a module that was previously found by \function{find_module()} (or by
|
|
an otherwise conducted search yielding compatible results). This
|
|
function does more than importing the module: if the module was
|
|
already imported, it will reload the module! The \var{name} argument
|
|
indicates the full module name (including the package name, if this is
|
|
a submodule of a package). The \var{file} argument is an open file,
|
|
and \var{filename} is the corresponding file name; these can be
|
|
\code{None} and \code{''}, respectively, when the module is not being
|
|
loaded from a file. The \var{description} argument is a tuple, as
|
|
would be returned by \function{get_suffixes()}, describing what kind
|
|
of module must be loaded.
|
|
|
|
If the load is successful, the return value is the module object;
|
|
otherwise, an exception (usually \exception{ImportError}) is raised.
|
|
|
|
\strong{Important:} the caller is responsible for closing the
|
|
\var{file} argument, if it was not \code{None}, even when an exception
|
|
is raised. This is best done using a \keyword{try}
|
|
... \keyword{finally} statement.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{new_module}{name}
|
|
Return a new empty module object called \var{name}. This object is
|
|
\emph{not} inserted in \code{sys.modules}.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{lock_held}{}
|
|
Return \code{True} if the import lock is currently held, else \code{False}.
|
|
On platforms without threads, always return \code{False}.
|
|
|
|
On platforms with threads, a thread executing an import holds an internal
|
|
lock until the import is complete.
|
|
This lock blocks other threads from doing an import until the original
|
|
import completes, which in turn prevents other threads from seeing
|
|
incomplete module objects constructed by the original thread while in
|
|
the process of completing its import (and the imports, if any,
|
|
triggered by that).
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{acquire_lock}{}
|
|
Acquires the interpreter's import lock for the current thread. This lock
|
|
should be used by import hooks to ensure thread-safety when importing modules.
|
|
On platforms without threads, this function does nothing.
|
|
\versionadded{2.3}
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{release_lock}{}
|
|
Release the interpreter's import lock.
|
|
On platforms without threads, this function does nothing.
|
|
\versionadded{2.3}
|
|
\end{funcdesc}
|
|
|
|
The following constants with integer values, defined in this module,
|
|
are used to indicate the search result of \function{find_module()}.
|
|
|
|
\begin{datadesc}{PY_SOURCE}
|
|
The module was found as a source file.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{PY_COMPILED}
|
|
The module was found as a compiled code object file.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{C_EXTENSION}
|
|
The module was found as dynamically loadable shared library.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{PY_RESOURCE}
|
|
The module was found as a Mac OS 9 resource. This value can only be
|
|
returned on a Mac OS 9 or earlier Macintosh.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{PKG_DIRECTORY}
|
|
The module was found as a package directory.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{C_BUILTIN}
|
|
The module was found as a built-in module.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{PY_FROZEN}
|
|
The module was found as a frozen module (see \function{init_frozen()}).
|
|
\end{datadesc}
|
|
|
|
The following constant and functions are obsolete; their functionality
|
|
is available through \function{find_module()} or \function{load_module()}.
|
|
They are kept around for backward compatibility:
|
|
|
|
\begin{datadesc}{SEARCH_ERROR}
|
|
Unused.
|
|
\end{datadesc}
|
|
|
|
\begin{funcdesc}{init_builtin}{name}
|
|
Initialize the built-in module called \var{name} and return its module
|
|
object along with storing it in \code{sys.modules}. If the module was already
|
|
initialized, it will be initialized \emph{again}. Re-initialization involves
|
|
the copying of the built-in module's \code{__dict__} from the cached
|
|
module over the module's entry in \code{sys.modules}. If there is no
|
|
built-in module called \var{name}, \code{None} is returned.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{init_frozen}{name}
|
|
Initialize the frozen module called \var{name} and return its module
|
|
object. If the module was already initialized, it will be initialized
|
|
\emph{again}. If there is no frozen module called \var{name},
|
|
\code{None} is returned. (Frozen modules are modules written in
|
|
Python whose compiled byte-code object is incorporated into a
|
|
custom-built Python interpreter by Python's \program{freeze} utility.
|
|
See \file{Tools/freeze/} for now.)
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{is_builtin}{name}
|
|
Return \code{1} if there is a built-in module called \var{name} which
|
|
can be initialized again. Return \code{-1} if there is a built-in
|
|
module called \var{name} which cannot be initialized again (see
|
|
\function{init_builtin()}). Return \code{0} if there is no built-in
|
|
module called \var{name}.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{is_frozen}{name}
|
|
Return \code{True} if there is a frozen module (see
|
|
\function{init_frozen()}) called \var{name}, or \code{False} if there is
|
|
no such module.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{load_compiled}{name, pathname, \optional{file}}
|
|
\indexii{file}{byte-code}
|
|
Load and initialize a module implemented as a byte-compiled code file
|
|
and return its module object. If the module was already initialized,
|
|
it will be initialized \emph{again}. The \var{name} argument is used
|
|
to create or access a module object. The \var{pathname} argument
|
|
points to the byte-compiled code file. The \var{file}
|
|
argument is the byte-compiled code file, open for reading in binary
|
|
mode, from the beginning.
|
|
It must currently be a real file object, not a
|
|
user-defined class emulating a file.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{load_dynamic}{name, pathname\optional{, file}}
|
|
Load and initialize a module implemented as a dynamically loadable
|
|
shared library and return its module object. If the module was
|
|
already initialized, it will be initialized \emph{again}.
|
|
Re-initialization involves copying the \code{__dict__} attribute of the cached
|
|
instance of the module over the value used in the module cached in
|
|
\code{sys.modules}. The \var{pathname} argument must point to the shared
|
|
library. The \var{name} argument is used to construct the name of the
|
|
initialization function: an external C function called
|
|
\samp{init\var{name}()} in the shared library is called. The optional
|
|
\var{file} argument is ignored. (Note: using shared libraries is highly
|
|
system dependent, and not all systems support it.)
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{load_source}{name, pathname\optional{, file}}
|
|
Load and initialize a module implemented as a Python source file and
|
|
return its module object. If the module was already initialized, it
|
|
will be initialized \emph{again}. The \var{name} argument is used to
|
|
create or access a module object. The \var{pathname} argument points
|
|
to the source file. The \var{file} argument is the source
|
|
file, open for reading as text, from the beginning.
|
|
It must currently be a real file
|
|
object, not a user-defined class emulating a file. Note that if a
|
|
properly matching byte-compiled file (with suffix \file{.pyc} or
|
|
\file{.pyo}) exists, it will be used instead of parsing the given
|
|
source file.
|
|
\end{funcdesc}
|
|
|
|
\begin{classdesc}{NullImporter}{path_string}
|
|
The \class{NullImporter} type is a \pep{302} import hook that handles
|
|
non-directory path strings by failing to find any modules. Calling this
|
|
type with an existing directory or empty string raises
|
|
\exception{ImportError}. Otherwise, a \class{NullImporter} instance is
|
|
returned.
|
|
|
|
Python adds instances of this type to \code{sys.path_importer_cache} for
|
|
any path entries that are not directories and are not handled by any other
|
|
path hooks on \code{sys.path_hooks}. Instances have only one method:
|
|
|
|
\begin{methoddesc}{find_module}{fullname \optional{, path}}
|
|
This method always returns \code{None}, indicating that the requested
|
|
module could not be found.
|
|
\end{methoddesc}
|
|
|
|
\versionadded{2.5}
|
|
\end{classdesc}
|
|
|
|
\subsection{Examples}
|
|
\label{examples-imp}
|
|
|
|
The following function emulates what was the standard import statement
|
|
up to Python 1.4 (no hierarchical module names). (This
|
|
\emph{implementation} wouldn't work in that version, since
|
|
\function{find_module()} has been extended and
|
|
\function{load_module()} has been added in 1.4.)
|
|
|
|
\begin{verbatim}
|
|
import imp
|
|
import sys
|
|
|
|
def __import__(name, globals=None, locals=None, fromlist=None):
|
|
# Fast path: see if the module has already been imported.
|
|
try:
|
|
return sys.modules[name]
|
|
except KeyError:
|
|
pass
|
|
|
|
# If any of the following calls raises an exception,
|
|
# there's a problem we can't handle -- let the caller handle it.
|
|
|
|
fp, pathname, description = imp.find_module(name)
|
|
|
|
try:
|
|
return imp.load_module(name, fp, pathname, description)
|
|
finally:
|
|
# Since we may exit via an exception, close fp explicitly.
|
|
if fp:
|
|
fp.close()
|
|
\end{verbatim}
|
|
|
|
A more complete example that implements hierarchical module names and
|
|
includes a \function{reload()} function can be
|
|
found in the module \module{knee}\refmodindex{knee}. The
|
|
\module{knee} module can be found in \file{Demo/imputil/} in the
|
|
Python source distribution.
|