1942 lines
91 KiB
Plaintext
1942 lines
91 KiB
Plaintext
|
=============================================================
|
||
|
Package Discovery and Resource Access using ``pkg_resources``
|
||
|
=============================================================
|
||
|
|
||
|
The ``pkg_resources`` module distributed with ``setuptools`` provides an API
|
||
|
for Python libraries to access their resource files, and for extensible
|
||
|
applications and frameworks to automatically discover plugins. It also
|
||
|
provides runtime support for using C extensions that are inside zipfile-format
|
||
|
eggs, support for merging packages that have separately-distributed modules or
|
||
|
subpackages, and APIs for managing Python's current "working set" of active
|
||
|
packages.
|
||
|
|
||
|
|
||
|
.. contents:: **Table of Contents**
|
||
|
|
||
|
|
||
|
--------
|
||
|
Overview
|
||
|
--------
|
||
|
|
||
|
The ``pkg_resources`` module provides runtime facilities for finding,
|
||
|
introspecting, activating and using installed Python distributions. Some
|
||
|
of the more advanced features (notably the support for parallel installation
|
||
|
of multiple versions) rely specifically on the "egg" format (either as a
|
||
|
zip archive or subdirectory), while others (such as plugin discovery) will
|
||
|
work correctly so long as "egg-info" metadata directories are available for
|
||
|
relevant distributions.
|
||
|
|
||
|
Eggs are a distribution format for Python modules, similar in concept to
|
||
|
Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
|
||
|
However, unlike a pure distribution format, eggs can also be installed and
|
||
|
added directly to ``sys.path`` as an import location. When installed in
|
||
|
this way, eggs are *discoverable*, meaning that they carry metadata that
|
||
|
unambiguously identifies their contents and dependencies. This means that
|
||
|
an installed egg can be *automatically* found and added to ``sys.path`` in
|
||
|
response to simple requests of the form, "get me everything I need to use
|
||
|
docutils' PDF support". This feature allows mutually conflicting versions of
|
||
|
a distribution to co-exist in the same Python installation, with individual
|
||
|
applications activating the desired version at runtime by manipulating the
|
||
|
contents of ``sys.path`` (this differs from the virtual environment
|
||
|
approach, which involves creating isolated environments for each
|
||
|
application).
|
||
|
|
||
|
The following terms are needed in order to explain the capabilities offered
|
||
|
by this module:
|
||
|
|
||
|
project
|
||
|
A library, framework, script, plugin, application, or collection of data
|
||
|
or other resources, or some combination thereof. Projects are assumed to
|
||
|
have "relatively unique" names, e.g. names registered with PyPI.
|
||
|
|
||
|
release
|
||
|
A snapshot of a project at a particular point in time, denoted by a version
|
||
|
identifier.
|
||
|
|
||
|
distribution
|
||
|
A file or files that represent a particular release.
|
||
|
|
||
|
importable distribution
|
||
|
A file or directory that, if placed on ``sys.path``, allows Python to
|
||
|
import any modules contained within it.
|
||
|
|
||
|
pluggable distribution
|
||
|
An importable distribution whose filename unambiguously identifies its
|
||
|
release (i.e. project and version), and whose contents unambiguously
|
||
|
specify what releases of other projects will satisfy its runtime
|
||
|
requirements.
|
||
|
|
||
|
extra
|
||
|
An "extra" is an optional feature of a release, that may impose additional
|
||
|
runtime requirements. For example, if docutils PDF support required a
|
||
|
PDF support library to be present, docutils could define its PDF support as
|
||
|
an "extra", and list what other project releases need to be available in
|
||
|
order to provide it.
|
||
|
|
||
|
environment
|
||
|
A collection of distributions potentially available for importing, but not
|
||
|
necessarily active. More than one distribution (i.e. release version) for
|
||
|
a given project may be present in an environment.
|
||
|
|
||
|
working set
|
||
|
A collection of distributions actually available for importing, as on
|
||
|
``sys.path``. At most one distribution (release version) of a given
|
||
|
project may be present in a working set, as otherwise there would be
|
||
|
ambiguity as to what to import.
|
||
|
|
||
|
eggs
|
||
|
Eggs are pluggable distributions in one of the three formats currently
|
||
|
supported by ``pkg_resources``. There are built eggs, development eggs,
|
||
|
and egg links. Built eggs are directories or zipfiles whose name ends
|
||
|
with ``.egg`` and follows the egg naming conventions, and contain an
|
||
|
``EGG-INFO`` subdirectory (zipped or otherwise). Development eggs are
|
||
|
normal directories of Python code with one or more ``ProjectName.egg-info``
|
||
|
subdirectories. The development egg format is also used to provide a
|
||
|
default version of a distribution that is available to software that
|
||
|
doesn't use ``pkg_resources`` to request specific versions. Egg links
|
||
|
are ``*.egg-link`` files that contain the name of a built or
|
||
|
development egg, to support symbolic linking on platforms that do not
|
||
|
have native symbolic links (or where the symbolic link support is
|
||
|
limited).
|
||
|
|
||
|
(For more information about these terms and concepts, see also this
|
||
|
`architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)
|
||
|
|
||
|
.. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html
|
||
|
|
||
|
|
||
|
.. -----------------
|
||
|
.. Developer's Guide
|
||
|
.. -----------------
|
||
|
|
||
|
.. This section isn't written yet. Currently planned topics include
|
||
|
Accessing Resources
|
||
|
Finding and Activating Package Distributions
|
||
|
get_provider()
|
||
|
require()
|
||
|
WorkingSet
|
||
|
iter_distributions
|
||
|
Running Scripts
|
||
|
Configuration
|
||
|
Namespace Packages
|
||
|
Extensible Applications and Frameworks
|
||
|
Locating entry points
|
||
|
Activation listeners
|
||
|
Metadata access
|
||
|
Extended Discovery and Installation
|
||
|
Supporting Custom PEP 302 Implementations
|
||
|
.. For now, please check out the extensive `API Reference`_ below.
|
||
|
|
||
|
|
||
|
-------------
|
||
|
API Reference
|
||
|
-------------
|
||
|
|
||
|
Namespace Package Support
|
||
|
=========================
|
||
|
|
||
|
A namespace package is a package that only contains other packages and modules,
|
||
|
with no direct contents of its own. Such packages can be split across
|
||
|
multiple, separately-packaged distributions. They are normally used to split
|
||
|
up large packages produced by a single organization, such as in the ``zope``
|
||
|
namespace package for Zope Corporation packages, and the ``peak`` namespace
|
||
|
package for the Python Enterprise Application Kit.
|
||
|
|
||
|
To create a namespace package, you list it in the ``namespace_packages``
|
||
|
argument to ``setup()``, in your project's ``setup.py``. (See the
|
||
|
:ref:`setuptools documentation on namespace packages <Namespace Packages>` for
|
||
|
more information on this.) Also, you must add a ``declare_namespace()`` call
|
||
|
in the package's ``__init__.py`` file(s):
|
||
|
|
||
|
``declare_namespace(name)``
|
||
|
Declare that the dotted package name `name` is a "namespace package" whose
|
||
|
contained packages and modules may be spread across multiple distributions.
|
||
|
The named package's ``__path__`` will be extended to include the
|
||
|
corresponding package in all distributions on ``sys.path`` that contain a
|
||
|
package of that name. (More precisely, if an importer's
|
||
|
``find_module(name)`` returns a loader, then it will also be searched for
|
||
|
the package's contents.) Whenever a Distribution's ``activate()`` method
|
||
|
is invoked, it checks for the presence of namespace packages and updates
|
||
|
their ``__path__`` contents accordingly.
|
||
|
|
||
|
Applications that manipulate namespace packages or directly alter ``sys.path``
|
||
|
at runtime may also need to use this API function:
|
||
|
|
||
|
``fixup_namespace_packages(path_item)``
|
||
|
Declare that `path_item` is a newly added item on ``sys.path`` that may
|
||
|
need to be used to update existing namespace packages. Ordinarily, this is
|
||
|
called for you when an egg is automatically added to ``sys.path``, but if
|
||
|
your application modifies ``sys.path`` to include locations that may
|
||
|
contain portions of a namespace package, you will need to call this
|
||
|
function to ensure they are added to the existing namespace packages.
|
||
|
|
||
|
Although by default ``pkg_resources`` only supports namespace packages for
|
||
|
filesystem and zip importers, you can extend its support to other "importers"
|
||
|
compatible with PEP 302 using the ``register_namespace_handler()`` function.
|
||
|
See the section below on `Supporting Custom Importers`_ for details.
|
||
|
|
||
|
|
||
|
``WorkingSet`` Objects
|
||
|
======================
|
||
|
|
||
|
The ``WorkingSet`` class provides access to a collection of "active"
|
||
|
distributions. In general, there is only one meaningful ``WorkingSet``
|
||
|
instance: the one that represents the distributions that are currently active
|
||
|
on ``sys.path``. This global instance is available under the name
|
||
|
``working_set`` in the ``pkg_resources`` module. However, specialized
|
||
|
tools may wish to manipulate working sets that don't correspond to
|
||
|
``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.
|
||
|
|
||
|
It's important to note that the global ``working_set`` object is initialized
|
||
|
from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
|
||
|
if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs. If
|
||
|
you manually modify ``sys.path``, you must invoke the appropriate methods on
|
||
|
the ``working_set`` instance to keep it in sync. Unfortunately, Python does
|
||
|
not provide any way to detect arbitrary changes to a list object like
|
||
|
``sys.path``, so ``pkg_resources`` cannot automatically update the
|
||
|
``working_set`` based on changes to ``sys.path``.
|
||
|
|
||
|
``WorkingSet(entries=None)``
|
||
|
Create a ``WorkingSet`` from an iterable of path entries. If `entries`
|
||
|
is not supplied, it defaults to the value of ``sys.path`` at the time
|
||
|
the constructor is called.
|
||
|
|
||
|
Note that you will not normally construct ``WorkingSet`` instances
|
||
|
yourself, but instead you will implicitly or explicitly use the global
|
||
|
``working_set`` instance. For the most part, the ``pkg_resources`` API
|
||
|
is designed so that the ``working_set`` is used by default, such that you
|
||
|
don't have to explicitly refer to it most of the time.
|
||
|
|
||
|
All distributions available directly on ``sys.path`` will be activated
|
||
|
automatically when ``pkg_resources`` is imported. This behaviour can cause
|
||
|
version conflicts for applications which require non-default versions of
|
||
|
those distributions. To handle this situation, ``pkg_resources`` checks for a
|
||
|
``__requires__`` attribute in the ``__main__`` module when initializing the
|
||
|
default working set, and uses this to ensure a suitable version of each
|
||
|
affected distribution is activated. For example::
|
||
|
|
||
|
__requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
|
||
|
import pkg_resources
|
||
|
|
||
|
|
||
|
Basic ``WorkingSet`` Methods
|
||
|
----------------------------
|
||
|
|
||
|
The following methods of ``WorkingSet`` objects are also available as module-
|
||
|
level functions in ``pkg_resources`` that apply to the default ``working_set``
|
||
|
instance. Thus, you can use e.g. ``pkg_resources.require()`` as an
|
||
|
abbreviation for ``pkg_resources.working_set.require()``:
|
||
|
|
||
|
|
||
|
``require(*requirements)``
|
||
|
Ensure that distributions matching `requirements` are activated
|
||
|
|
||
|
`requirements` must be a string or a (possibly-nested) sequence
|
||
|
thereof, specifying the distributions and versions required. The
|
||
|
return value is a sequence of the distributions that needed to be
|
||
|
activated to fulfill the requirements; all relevant distributions are
|
||
|
included, even if they were already activated in this working set.
|
||
|
|
||
|
For the syntax of requirement specifiers, see the section below on
|
||
|
`Requirements Parsing`_.
|
||
|
|
||
|
In general, it should not be necessary for you to call this method
|
||
|
directly. It's intended more for use in quick-and-dirty scripting and
|
||
|
interactive interpreter hacking than for production use. If you're creating
|
||
|
an actual library or application, it's strongly recommended that you create
|
||
|
a "setup.py" script using ``setuptools``, and declare all your requirements
|
||
|
there. That way, tools like EasyInstall can automatically detect what
|
||
|
requirements your package has, and deal with them accordingly.
|
||
|
|
||
|
Note that calling ``require('SomePackage')`` will not install
|
||
|
``SomePackage`` if it isn't already present. If you need to do this, you
|
||
|
should use the ``resolve()`` method instead, which allows you to pass an
|
||
|
``installer`` callback that will be invoked when a needed distribution
|
||
|
can't be found on the local machine. You can then have this callback
|
||
|
display a dialog, automatically download the needed distribution, or
|
||
|
whatever else is appropriate for your application. See the documentation
|
||
|
below on the ``resolve()`` method for more information, and also on the
|
||
|
``obtain()`` method of ``Environment`` objects.
|
||
|
|
||
|
``run_script(requires, script_name)``
|
||
|
Locate distribution specified by `requires` and run its `script_name`
|
||
|
script. `requires` must be a string containing a requirement specifier.
|
||
|
(See `Requirements Parsing`_ below for the syntax.)
|
||
|
|
||
|
The script, if found, will be executed in *the caller's globals*. That's
|
||
|
because this method is intended to be called from wrapper scripts that
|
||
|
act as a proxy for the "real" scripts in a distribution. A wrapper script
|
||
|
usually doesn't need to do anything but invoke this function with the
|
||
|
correct arguments.
|
||
|
|
||
|
If you need more control over the script execution environment, you
|
||
|
probably want to use the ``run_script()`` method of a ``Distribution``
|
||
|
object's `Metadata API`_ instead.
|
||
|
|
||
|
``iter_entry_points(group, name=None)``
|
||
|
Yield entry point objects from `group` matching `name`
|
||
|
|
||
|
If `name` is None, yields all entry points in `group` from all
|
||
|
distributions in the working set, otherwise only ones matching both
|
||
|
`group` and `name` are yielded. Entry points are yielded from the active
|
||
|
distributions in the order that the distributions appear in the working
|
||
|
set. (For the global ``working_set``, this should be the same as the order
|
||
|
that they are listed in ``sys.path``.) Note that within the entry points
|
||
|
advertised by an individual distribution, there is no particular ordering.
|
||
|
|
||
|
Please see the section below on `Entry Points`_ for more information.
|
||
|
|
||
|
|
||
|
``WorkingSet`` Methods and Attributes
|
||
|
-------------------------------------
|
||
|
|
||
|
These methods are used to query or manipulate the contents of a specific
|
||
|
working set, so they must be explicitly invoked on a particular ``WorkingSet``
|
||
|
instance:
|
||
|
|
||
|
``add_entry(entry)``
|
||
|
Add a path item to the ``entries``, finding any distributions on it. You
|
||
|
should use this when you add additional items to ``sys.path`` and you want
|
||
|
the global ``working_set`` to reflect the change. This method is also
|
||
|
called by the ``WorkingSet()`` constructor during initialization.
|
||
|
|
||
|
This method uses ``find_distributions(entry,True)`` to find distributions
|
||
|
corresponding to the path entry, and then ``add()`` them. `entry` is
|
||
|
always appended to the ``entries`` attribute, even if it is already
|
||
|
present, however. (This is because ``sys.path`` can contain the same value
|
||
|
more than once, and the ``entries`` attribute should be able to reflect
|
||
|
this.)
|
||
|
|
||
|
``__contains__(dist)``
|
||
|
True if `dist` is active in this ``WorkingSet``. Note that only one
|
||
|
distribution for a given project can be active in a given ``WorkingSet``.
|
||
|
|
||
|
``__iter__()``
|
||
|
Yield distributions for non-duplicate projects in the working set.
|
||
|
The yield order is the order in which the items' path entries were
|
||
|
added to the working set.
|
||
|
|
||
|
``find(req)``
|
||
|
Find a distribution matching `req` (a ``Requirement`` instance).
|
||
|
If there is an active distribution for the requested project, this
|
||
|
returns it, as long as it meets the version requirement specified by
|
||
|
`req`. But, if there is an active distribution for the project and it
|
||
|
does *not* meet the `req` requirement, ``VersionConflict`` is raised.
|
||
|
If there is no active distribution for the requested project, ``None``
|
||
|
is returned.
|
||
|
|
||
|
``resolve(requirements, env=None, installer=None)``
|
||
|
List all distributions needed to (recursively) meet `requirements`
|
||
|
|
||
|
`requirements` must be a sequence of ``Requirement`` objects. `env`,
|
||
|
if supplied, should be an ``Environment`` instance. If
|
||
|
not supplied, an ``Environment`` is created from the working set's
|
||
|
``entries``. `installer`, if supplied, will be invoked with each
|
||
|
requirement that cannot be met by an already-installed distribution; it
|
||
|
should return a ``Distribution`` or ``None``. (See the ``obtain()`` method
|
||
|
of `Environment Objects`_, below, for more information on the `installer`
|
||
|
argument.)
|
||
|
|
||
|
``add(dist, entry=None)``
|
||
|
Add `dist` to working set, associated with `entry`
|
||
|
|
||
|
If `entry` is unspecified, it defaults to ``dist.location``. On exit from
|
||
|
this routine, `entry` is added to the end of the working set's ``.entries``
|
||
|
(if it wasn't already present).
|
||
|
|
||
|
`dist` is only added to the working set if it's for a project that
|
||
|
doesn't already have a distribution active in the set. If it's
|
||
|
successfully added, any callbacks registered with the ``subscribe()``
|
||
|
method will be called. (See `Receiving Change Notifications`_, below.)
|
||
|
|
||
|
Note: ``add()`` is automatically called for you by the ``require()``
|
||
|
method, so you don't normally need to use this method directly.
|
||
|
|
||
|
``entries``
|
||
|
This attribute represents a "shadow" ``sys.path``, primarily useful for
|
||
|
debugging. If you are experiencing import problems, you should check
|
||
|
the global ``working_set`` object's ``entries`` against ``sys.path``, to
|
||
|
ensure that they match. If they do not, then some part of your program
|
||
|
is manipulating ``sys.path`` without updating the ``working_set``
|
||
|
accordingly. IMPORTANT NOTE: do not directly manipulate this attribute!
|
||
|
Setting it equal to ``sys.path`` will not fix your problem, any more than
|
||
|
putting black tape over an "engine warning" light will fix your car! If
|
||
|
this attribute is out of sync with ``sys.path``, it's merely an *indicator*
|
||
|
of the problem, not the cause of it.
|
||
|
|
||
|
|
||
|
Receiving Change Notifications
|
||
|
------------------------------
|
||
|
|
||
|
Extensible applications and frameworks may need to receive notification when
|
||
|
a new distribution (such as a plug-in component) has been added to a working
|
||
|
set. This is what the ``subscribe()`` method and ``add_activation_listener()``
|
||
|
function are for.
|
||
|
|
||
|
``subscribe(callback)``
|
||
|
Invoke ``callback(distribution)`` once for each active distribution that is
|
||
|
in the set now, or gets added later. Because the callback is invoked for
|
||
|
already-active distributions, you do not need to loop over the working set
|
||
|
yourself to deal with the existing items; just register the callback and
|
||
|
be prepared for the fact that it will be called immediately by this method.
|
||
|
|
||
|
Note that callbacks *must not* allow exceptions to propagate, or they will
|
||
|
interfere with the operation of other callbacks and possibly result in an
|
||
|
inconsistent working set state. Callbacks should use a try/except block
|
||
|
to ignore, log, or otherwise process any errors, especially since the code
|
||
|
that caused the callback to be invoked is unlikely to be able to handle
|
||
|
the errors any better than the callback itself.
|
||
|
|
||
|
``pkg_resources.add_activation_listener()`` is an alternate spelling of
|
||
|
``pkg_resources.working_set.subscribe()``.
|
||
|
|
||
|
|
||
|
Locating Plugins
|
||
|
----------------
|
||
|
|
||
|
Extensible applications will sometimes have a "plugin directory" or a set of
|
||
|
plugin directories, from which they want to load entry points or other
|
||
|
metadata. The ``find_plugins()`` method allows you to do this, by scanning an
|
||
|
environment for the newest version of each project that can be safely loaded
|
||
|
without conflicts or missing requirements.
|
||
|
|
||
|
``find_plugins(plugin_env, full_env=None, fallback=True)``
|
||
|
Scan `plugin_env` and identify which distributions could be added to this
|
||
|
working set without version conflicts or missing requirements.
|
||
|
|
||
|
Example usage::
|
||
|
|
||
|
distributions, errors = working_set.find_plugins(
|
||
|
Environment(plugin_dirlist)
|
||
|
)
|
||
|
map(working_set.add, distributions) # add plugins+libs to sys.path
|
||
|
print "Couldn't load", errors # display errors
|
||
|
|
||
|
The `plugin_env` should be an ``Environment`` instance that contains only
|
||
|
distributions that are in the project's "plugin directory" or directories.
|
||
|
The `full_env`, if supplied, should be an ``Environment`` instance that
|
||
|
contains all currently-available distributions.
|
||
|
|
||
|
If `full_env` is not supplied, one is created automatically from the
|
||
|
``WorkingSet`` this method is called on, which will typically mean that
|
||
|
every directory on ``sys.path`` will be scanned for distributions.
|
||
|
|
||
|
This method returns a 2-tuple: (`distributions`, `error_info`), where
|
||
|
`distributions` is a list of the distributions found in `plugin_env` that
|
||
|
were loadable, along with any other distributions that are needed to resolve
|
||
|
their dependencies. `error_info` is a dictionary mapping unloadable plugin
|
||
|
distributions to an exception instance describing the error that occurred.
|
||
|
Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
|
||
|
instance.
|
||
|
|
||
|
Most applications will use this method mainly on the master ``working_set``
|
||
|
instance in ``pkg_resources``, and then immediately add the returned
|
||
|
distributions to the working set so that they are available on sys.path.
|
||
|
This will make it possible to find any entry points, and allow any other
|
||
|
metadata tracking and hooks to be activated.
|
||
|
|
||
|
The resolution algorithm used by ``find_plugins()`` is as follows. First,
|
||
|
the project names of the distributions present in `plugin_env` are sorted.
|
||
|
Then, each project's eggs are tried in descending version order (i.e.,
|
||
|
newest version first).
|
||
|
|
||
|
An attempt is made to resolve each egg's dependencies. If the attempt is
|
||
|
successful, the egg and its dependencies are added to the output list and to
|
||
|
a temporary copy of the working set. The resolution process continues with
|
||
|
the next project name, and no older eggs for that project are tried.
|
||
|
|
||
|
If the resolution attempt fails, however, the error is added to the error
|
||
|
dictionary. If the `fallback` flag is true, the next older version of the
|
||
|
plugin is tried, until a working version is found. If false, the resolution
|
||
|
process continues with the next plugin project name.
|
||
|
|
||
|
Some applications may have stricter fallback requirements than others. For
|
||
|
example, an application that has a database schema or persistent objects
|
||
|
may not be able to safely downgrade a version of a package. Others may want
|
||
|
to ensure that a new plugin configuration is either 100% good or else
|
||
|
revert to a known-good configuration. (That is, they may wish to revert to
|
||
|
a known configuration if the `error_info` return value is non-empty.)
|
||
|
|
||
|
Note that this algorithm gives precedence to satisfying the dependencies of
|
||
|
alphabetically prior project names in case of version conflicts. If two
|
||
|
projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
|
||
|
of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
|
||
|
disabled due to version conflict.
|
||
|
|
||
|
|
||
|
``Environment`` Objects
|
||
|
=======================
|
||
|
|
||
|
An "environment" is a collection of ``Distribution`` objects, usually ones
|
||
|
that are present and potentially importable on the current platform.
|
||
|
``Environment`` objects are used by ``pkg_resources`` to index available
|
||
|
distributions during dependency resolution.
|
||
|
|
||
|
``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
|
||
|
Create an environment snapshot by scanning `search_path` for distributions
|
||
|
compatible with `platform` and `python`. `search_path` should be a
|
||
|
sequence of strings such as might be used on ``sys.path``. If a
|
||
|
`search_path` isn't supplied, ``sys.path`` is used.
|
||
|
|
||
|
`platform` is an optional string specifying the name of the platform
|
||
|
that platform-specific distributions must be compatible with. If
|
||
|
unspecified, it defaults to the current platform. `python` is an
|
||
|
optional string naming the desired version of Python (e.g. ``'2.4'``);
|
||
|
it defaults to the currently-running version.
|
||
|
|
||
|
You may explicitly set `platform` (and/or `python`) to ``None`` if you
|
||
|
wish to include *all* distributions, not just those compatible with the
|
||
|
running platform or Python version.
|
||
|
|
||
|
Note that `search_path` is scanned immediately for distributions, and the
|
||
|
resulting ``Environment`` is a snapshot of the found distributions. It
|
||
|
is not automatically updated if the system's state changes due to e.g.
|
||
|
installation or removal of distributions.
|
||
|
|
||
|
``__getitem__(project_name)``
|
||
|
Returns a list of distributions for the given project name, ordered
|
||
|
from newest to oldest version. (And highest to lowest format precedence
|
||
|
for distributions that contain the same version of the project.) If there
|
||
|
are no distributions for the project, returns an empty list.
|
||
|
|
||
|
``__iter__()``
|
||
|
Yield the unique project names of the distributions in this environment.
|
||
|
The yielded names are always in lower case.
|
||
|
|
||
|
``add(dist)``
|
||
|
Add `dist` to the environment if it matches the platform and python version
|
||
|
specified at creation time, and only if the distribution hasn't already
|
||
|
been added. (i.e., adding the same distribution more than once is a no-op.)
|
||
|
|
||
|
``remove(dist)``
|
||
|
Remove `dist` from the environment.
|
||
|
|
||
|
``can_add(dist)``
|
||
|
Is distribution `dist` acceptable for this environment? If it's not
|
||
|
compatible with the ``platform`` and ``python`` version values specified
|
||
|
when the environment was created, a false value is returned.
|
||
|
|
||
|
``__add__(dist_or_env)`` (``+`` operator)
|
||
|
Add a distribution or environment to an ``Environment`` instance, returning
|
||
|
a *new* environment object that contains all the distributions previously
|
||
|
contained by both. The new environment will have a ``platform`` and
|
||
|
``python`` of ``None``, meaning that it will not reject any distributions
|
||
|
from being added to it; it will simply accept whatever is added. If you
|
||
|
want the added items to be filtered for platform and Python version, or
|
||
|
you want to add them to the *same* environment instance, you should use
|
||
|
in-place addition (``+=``) instead.
|
||
|
|
||
|
``__iadd__(dist_or_env)`` (``+=`` operator)
|
||
|
Add a distribution or environment to an ``Environment`` instance
|
||
|
*in-place*, updating the existing instance and returning it. The
|
||
|
``platform`` and ``python`` filter attributes take effect, so distributions
|
||
|
in the source that do not have a suitable platform string or Python version
|
||
|
are silently ignored.
|
||
|
|
||
|
``best_match(req, working_set, installer=None)``
|
||
|
Find distribution best matching `req` and usable on `working_set`
|
||
|
|
||
|
This calls the ``find(req)`` method of the `working_set` to see if a
|
||
|
suitable distribution is already active. (This may raise
|
||
|
``VersionConflict`` if an unsuitable version of the project is already
|
||
|
active in the specified `working_set`.) If a suitable distribution isn't
|
||
|
active, this method returns the newest distribution in the environment
|
||
|
that meets the ``Requirement`` in `req`. If no suitable distribution is
|
||
|
found, and `installer` is supplied, then the result of calling
|
||
|
the environment's ``obtain(req, installer)`` method will be returned.
|
||
|
|
||
|
``obtain(requirement, installer=None)``
|
||
|
Obtain a distro that matches requirement (e.g. via download). In the
|
||
|
base ``Environment`` class, this routine just returns
|
||
|
``installer(requirement)``, unless `installer` is None, in which case
|
||
|
None is returned instead. This method is a hook that allows subclasses
|
||
|
to attempt other ways of obtaining a distribution before falling back
|
||
|
to the `installer` argument.
|
||
|
|
||
|
``scan(search_path=None)``
|
||
|
Scan `search_path` for distributions usable on `platform`
|
||
|
|
||
|
Any distributions found are added to the environment. `search_path` should
|
||
|
be a sequence of strings such as might be used on ``sys.path``. If not
|
||
|
supplied, ``sys.path`` is used. Only distributions conforming to
|
||
|
the platform/python version defined at initialization are added. This
|
||
|
method is a shortcut for using the ``find_distributions()`` function to
|
||
|
find the distributions from each item in `search_path`, and then calling
|
||
|
``add()`` to add each one to the environment.
|
||
|
|
||
|
|
||
|
``Requirement`` Objects
|
||
|
=======================
|
||
|
|
||
|
``Requirement`` objects express what versions of a project are suitable for
|
||
|
some purpose. These objects (or their string form) are used by various
|
||
|
``pkg_resources`` APIs in order to find distributions that a script or
|
||
|
distribution needs.
|
||
|
|
||
|
|
||
|
Requirements Parsing
|
||
|
--------------------
|
||
|
|
||
|
``parse_requirements(s)``
|
||
|
Yield ``Requirement`` objects for a string or iterable of lines. Each
|
||
|
requirement must start on a new line. See below for syntax.
|
||
|
|
||
|
``Requirement.parse(s)``
|
||
|
Create a ``Requirement`` object from a string or iterable of lines. A
|
||
|
``ValueError`` is raised if the string or lines do not contain a valid
|
||
|
requirement specifier, or if they contain more than one specifier. (To
|
||
|
parse multiple specifiers from a string or iterable of strings, use
|
||
|
``parse_requirements()`` instead.)
|
||
|
|
||
|
The syntax of a requirement specifier is defined in full in PEP 508.
|
||
|
|
||
|
Some examples of valid requirement specifiers::
|
||
|
|
||
|
FooProject >= 1.2
|
||
|
Fizzy [foo, bar]
|
||
|
PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
|
||
|
SomethingWhoseVersionIDontCareAbout
|
||
|
SomethingWithMarker[foo]>1.0;python_version<"2.7"
|
||
|
|
||
|
The project name is the only required portion of a requirement string, and
|
||
|
if it's the only thing supplied, the requirement will accept any version
|
||
|
of that project.
|
||
|
|
||
|
The "extras" in a requirement are used to request optional features of a
|
||
|
project, that may require additional project distributions in order to
|
||
|
function. For example, if the hypothetical "Report-O-Rama" project offered
|
||
|
optional PDF support, it might require an additional library in order to
|
||
|
provide that support. Thus, a project needing Report-O-Rama's PDF features
|
||
|
could use a requirement of ``Report-O-Rama[PDF]`` to request installation
|
||
|
or activation of both Report-O-Rama and any libraries it needs in order to
|
||
|
provide PDF support. For example, you could use::
|
||
|
|
||
|
easy_install.py Report-O-Rama[PDF]
|
||
|
|
||
|
To install the necessary packages using the EasyInstall program, or call
|
||
|
``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
|
||
|
distributions to sys.path at runtime.
|
||
|
|
||
|
The "markers" in a requirement are used to specify when a requirement
|
||
|
should be installed -- the requirement will be installed if the marker
|
||
|
evaluates as true in the current environment. For example, specifying
|
||
|
``argparse;python_version<"3.0"`` will not install in an Python 3
|
||
|
environment, but will in a Python 2 environment.
|
||
|
|
||
|
``Requirement`` Methods and Attributes
|
||
|
--------------------------------------
|
||
|
|
||
|
``__contains__(dist_or_version)``
|
||
|
Return true if `dist_or_version` fits the criteria for this requirement.
|
||
|
If `dist_or_version` is a ``Distribution`` object, its project name must
|
||
|
match the requirement's project name, and its version must meet the
|
||
|
requirement's version criteria. If `dist_or_version` is a string, it is
|
||
|
parsed using the ``parse_version()`` utility function. Otherwise, it is
|
||
|
assumed to be an already-parsed version.
|
||
|
|
||
|
The ``Requirement`` object's version specifiers (``.specs``) are internally
|
||
|
sorted into ascending version order, and used to establish what ranges of
|
||
|
versions are acceptable. Adjacent redundant conditions are effectively
|
||
|
consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
|
||
|
``"<2,<3"`` produces the same results as ``"<2"``). ``"!="`` versions are
|
||
|
excised from the ranges they fall within. The version being tested for
|
||
|
acceptability is then checked for membership in the resulting ranges.
|
||
|
|
||
|
``__eq__(other_requirement)``
|
||
|
A requirement compares equal to another requirement if they have
|
||
|
case-insensitively equal project names, version specifiers, and "extras".
|
||
|
(The order that extras and version specifiers are in is also ignored.)
|
||
|
Equal requirements also have equal hashes, so that requirements can be
|
||
|
used in sets or as dictionary keys.
|
||
|
|
||
|
``__str__()``
|
||
|
The string form of a ``Requirement`` is a string that, if passed to
|
||
|
``Requirement.parse()``, would return an equal ``Requirement`` object.
|
||
|
|
||
|
``project_name``
|
||
|
The name of the required project
|
||
|
|
||
|
``key``
|
||
|
An all-lowercase version of the ``project_name``, useful for comparison
|
||
|
or indexing.
|
||
|
|
||
|
``extras``
|
||
|
A tuple of names of "extras" that this requirement calls for. (These will
|
||
|
be all-lowercase and normalized using the ``safe_extra()`` parsing utility
|
||
|
function, so they may not exactly equal the extras the requirement was
|
||
|
created with.)
|
||
|
|
||
|
``specs``
|
||
|
A list of ``(op,version)`` tuples, sorted in ascending parsed-version
|
||
|
order. The `op` in each tuple is a comparison operator, represented as
|
||
|
a string. The `version` is the (unparsed) version number.
|
||
|
|
||
|
``marker``
|
||
|
An instance of ``packaging.markers.Marker`` that allows evaluation
|
||
|
against the current environment. May be None if no marker specified.
|
||
|
|
||
|
``url``
|
||
|
The location to download the requirement from if specified.
|
||
|
|
||
|
Entry Points
|
||
|
============
|
||
|
|
||
|
Entry points are a simple way for distributions to "advertise" Python objects
|
||
|
(such as functions or classes) for use by other distributions. Extensible
|
||
|
applications and frameworks can search for entry points with a particular name
|
||
|
or group, either from a specific distribution or from all active distributions
|
||
|
on sys.path, and then inspect or load the advertised objects at will.
|
||
|
|
||
|
Entry points belong to "groups" which are named with a dotted name similar to
|
||
|
a Python package or module name. For example, the ``setuptools`` package uses
|
||
|
an entry point named ``distutils.commands`` in order to find commands defined
|
||
|
by distutils extensions. ``setuptools`` treats the names of entry points
|
||
|
defined in that group as the acceptable commands for a setup script.
|
||
|
|
||
|
In a similar way, other packages can define their own entry point groups,
|
||
|
either using dynamic names within the group (like ``distutils.commands``), or
|
||
|
possibly using predefined names within the group. For example, a blogging
|
||
|
framework that offers various pre- or post-publishing hooks might define an
|
||
|
entry point group and look for entry points named "pre_process" and
|
||
|
"post_process" within that group.
|
||
|
|
||
|
To advertise an entry point, a project needs to use ``setuptools`` and provide
|
||
|
an ``entry_points`` argument to ``setup()`` in its setup script, so that the
|
||
|
entry points will be included in the distribution's metadata. For more
|
||
|
details, see the ``setuptools`` documentation. (XXX link here to setuptools)
|
||
|
|
||
|
Each project distribution can advertise at most one entry point of a given
|
||
|
name within the same entry point group. For example, a distutils extension
|
||
|
could advertise two different ``distutils.commands`` entry points, as long as
|
||
|
they had different names. However, there is nothing that prevents *different*
|
||
|
projects from advertising entry points of the same name in the same group. In
|
||
|
some cases, this is a desirable thing, since the application or framework that
|
||
|
uses the entry points may be calling them as hooks, or in some other way
|
||
|
combining them. It is up to the application or framework to decide what to do
|
||
|
if multiple distributions advertise an entry point; some possibilities include
|
||
|
using both entry points, displaying an error message, using the first one found
|
||
|
in sys.path order, etc.
|
||
|
|
||
|
|
||
|
Convenience API
|
||
|
---------------
|
||
|
|
||
|
In the following functions, the `dist` argument can be a ``Distribution``
|
||
|
instance, a ``Requirement`` instance, or a string specifying a requirement
|
||
|
(i.e. project name, version, etc.). If the argument is a string or
|
||
|
``Requirement``, the specified distribution is located (and added to sys.path
|
||
|
if not already present). An error will be raised if a matching distribution is
|
||
|
not available.
|
||
|
|
||
|
The `group` argument should be a string containing a dotted identifier,
|
||
|
identifying an entry point group. If you are defining an entry point group,
|
||
|
you should include some portion of your package's name in the group name so as
|
||
|
to avoid collision with other packages' entry point groups.
|
||
|
|
||
|
``load_entry_point(dist, group, name)``
|
||
|
Load the named entry point from the specified distribution, or raise
|
||
|
``ImportError``.
|
||
|
|
||
|
``get_entry_info(dist, group, name)``
|
||
|
Return an ``EntryPoint`` object for the given `group` and `name` from
|
||
|
the specified distribution. Returns ``None`` if the distribution has not
|
||
|
advertised a matching entry point.
|
||
|
|
||
|
``get_entry_map(dist, group=None)``
|
||
|
Return the distribution's entry point map for `group`, or the full entry
|
||
|
map for the distribution. This function always returns a dictionary,
|
||
|
even if the distribution advertises no entry points. If `group` is given,
|
||
|
the dictionary maps entry point names to the corresponding ``EntryPoint``
|
||
|
object. If `group` is None, the dictionary maps group names to
|
||
|
dictionaries that then map entry point names to the corresponding
|
||
|
``EntryPoint`` instance in that group.
|
||
|
|
||
|
``iter_entry_points(group, name=None)``
|
||
|
Yield entry point objects from `group` matching `name`.
|
||
|
|
||
|
If `name` is None, yields all entry points in `group` from all
|
||
|
distributions in the working set on sys.path, otherwise only ones matching
|
||
|
both `group` and `name` are yielded. Entry points are yielded from
|
||
|
the active distributions in the order that the distributions appear on
|
||
|
sys.path. (Within entry points for a particular distribution, however,
|
||
|
there is no particular ordering.)
|
||
|
|
||
|
(This API is actually a method of the global ``working_set`` object; see
|
||
|
the section above on `Basic WorkingSet Methods`_ for more information.)
|
||
|
|
||
|
|
||
|
Creating and Parsing
|
||
|
--------------------
|
||
|
|
||
|
``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
|
||
|
Create an ``EntryPoint`` instance. `name` is the entry point name. The
|
||
|
`module_name` is the (dotted) name of the module containing the advertised
|
||
|
object. `attrs` is an optional tuple of names to look up from the
|
||
|
module to obtain the advertised object. For example, an `attrs` of
|
||
|
``("foo","bar")`` and a `module_name` of ``"baz"`` would mean that the
|
||
|
advertised object could be obtained by the following code::
|
||
|
|
||
|
import baz
|
||
|
advertised_object = baz.foo.bar
|
||
|
|
||
|
The `extras` are an optional tuple of "extra feature" names that the
|
||
|
distribution needs in order to provide this entry point. When the
|
||
|
entry point is loaded, these extra features are looked up in the `dist`
|
||
|
argument to find out what other distributions may need to be activated
|
||
|
on sys.path; see the ``load()`` method for more details. The `extras`
|
||
|
argument is only meaningful if `dist` is specified. `dist` must be
|
||
|
a ``Distribution`` instance.
|
||
|
|
||
|
``EntryPoint.parse(src, dist=None)`` (classmethod)
|
||
|
Parse a single entry point from string `src`
|
||
|
|
||
|
Entry point syntax follows the form::
|
||
|
|
||
|
name = some.module:some.attr [extra1,extra2]
|
||
|
|
||
|
The entry name and module name are required, but the ``:attrs`` and
|
||
|
``[extras]`` parts are optional, as is the whitespace shown between
|
||
|
some of the items. The `dist` argument is passed through to the
|
||
|
``EntryPoint()`` constructor, along with the other values parsed from
|
||
|
`src`.
|
||
|
|
||
|
``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
|
||
|
Parse `lines` (a string or sequence of lines) to create a dictionary
|
||
|
mapping entry point names to ``EntryPoint`` objects. ``ValueError`` is
|
||
|
raised if entry point names are duplicated, if `group` is not a valid
|
||
|
entry point group name, or if there are any syntax errors. (Note: the
|
||
|
`group` parameter is used only for validation and to create more
|
||
|
informative error messages.) If `dist` is provided, it will be used to
|
||
|
set the ``dist`` attribute of the created ``EntryPoint`` objects.
|
||
|
|
||
|
``EntryPoint.parse_map(data, dist=None)`` (classmethod)
|
||
|
Parse `data` into a dictionary mapping group names to dictionaries mapping
|
||
|
entry point names to ``EntryPoint`` objects. If `data` is a dictionary,
|
||
|
then the keys are used as group names and the values are passed to
|
||
|
``parse_group()`` as the `lines` argument. If `data` is a string or
|
||
|
sequence of lines, it is first split into .ini-style sections (using
|
||
|
the ``split_sections()`` utility function) and the section names are used
|
||
|
as group names. In either case, the `dist` argument is passed through to
|
||
|
``parse_group()`` so that the entry points will be linked to the specified
|
||
|
distribution.
|
||
|
|
||
|
|
||
|
``EntryPoint`` Objects
|
||
|
----------------------
|
||
|
|
||
|
For simple introspection, ``EntryPoint`` objects have attributes that
|
||
|
correspond exactly to the constructor argument names: ``name``,
|
||
|
``module_name``, ``attrs``, ``extras``, and ``dist`` are all available. In
|
||
|
addition, the following methods are provided:
|
||
|
|
||
|
``load()``
|
||
|
Load the entry point, returning the advertised Python object. Effectively
|
||
|
calls ``self.require()`` then returns ``self.resolve()``.
|
||
|
|
||
|
``require(env=None, installer=None)``
|
||
|
Ensure that any "extras" needed by the entry point are available on
|
||
|
sys.path. ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
|
||
|
but no ``dist``, or if the named extras are not defined by the
|
||
|
distribution. If `env` is supplied, it must be an ``Environment``, and it
|
||
|
will be used to search for needed distributions if they are not already
|
||
|
present on sys.path. If `installer` is supplied, it must be a callable
|
||
|
taking a ``Requirement`` instance and returning a matching importable
|
||
|
``Distribution`` instance or None.
|
||
|
|
||
|
``resolve()``
|
||
|
Resolve the entry point from its module and attrs, returning the advertised
|
||
|
Python object. Raises ``ImportError`` if it cannot be obtained.
|
||
|
|
||
|
``__str__()``
|
||
|
The string form of an ``EntryPoint`` is a string that could be passed to
|
||
|
``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.
|
||
|
|
||
|
|
||
|
``Distribution`` Objects
|
||
|
========================
|
||
|
|
||
|
``Distribution`` objects represent collections of Python code that may or may
|
||
|
not be importable, and may or may not have metadata and resources associated
|
||
|
with them. Their metadata may include information such as what other projects
|
||
|
the distribution depends on, what entry points the distribution advertises, and
|
||
|
so on.
|
||
|
|
||
|
|
||
|
Getting or Creating Distributions
|
||
|
---------------------------------
|
||
|
|
||
|
Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
|
||
|
an ``Environment``. (See the sections above on `WorkingSet Objects`_ and
|
||
|
`Environment Objects`_, which are containers for active distributions and
|
||
|
available distributions, respectively.) You can also obtain ``Distribution``
|
||
|
objects from one of these high-level APIs:
|
||
|
|
||
|
``find_distributions(path_item, only=False)``
|
||
|
Yield distributions accessible via `path_item`. If `only` is true, yield
|
||
|
only distributions whose ``location`` is equal to `path_item`. In other
|
||
|
words, if `only` is true, this yields any distributions that would be
|
||
|
importable if `path_item` were on ``sys.path``. If `only` is false, this
|
||
|
also yields distributions that are "in" or "under" `path_item`, but would
|
||
|
not be importable unless their locations were also added to ``sys.path``.
|
||
|
|
||
|
``get_distribution(dist_spec)``
|
||
|
Return a ``Distribution`` object for a given ``Requirement`` or string.
|
||
|
If `dist_spec` is already a ``Distribution`` instance, it is returned.
|
||
|
If it is a ``Requirement`` object or a string that can be parsed into one,
|
||
|
it is used to locate and activate a matching distribution, which is then
|
||
|
returned.
|
||
|
|
||
|
However, if you're creating specialized tools for working with distributions,
|
||
|
or creating a new distribution format, you may also need to create
|
||
|
``Distribution`` objects directly, using one of the three constructors below.
|
||
|
|
||
|
These constructors all take an optional `metadata` argument, which is used to
|
||
|
access any resources or metadata associated with the distribution. `metadata`
|
||
|
must be an object that implements the ``IResourceProvider`` interface, or None.
|
||
|
If it is None, an ``EmptyProvider`` is used instead. ``Distribution`` objects
|
||
|
implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
|
||
|
delegating them to the `metadata` object.
|
||
|
|
||
|
``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
|
||
|
Create a distribution for `location`, which must be a string such as a
|
||
|
URL, filename, or other string that might be used on ``sys.path``.
|
||
|
`basename` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
|
||
|
If `basename` ends with ``.egg``, then the project's name, version, python
|
||
|
version and platform are extracted from the filename and used to set those
|
||
|
properties of the created distribution. Any additional keyword arguments
|
||
|
are forwarded to the ``Distribution()`` constructor.
|
||
|
|
||
|
``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
|
||
|
Create a distribution by parsing a local filename. This is a shorter way
|
||
|
of saying ``Distribution.from_location(normalize_path(filename),
|
||
|
os.path.basename(filename), metadata)``. In other words, it creates a
|
||
|
distribution whose location is the normalize form of the filename, parsing
|
||
|
name and version information from the base portion of the filename. Any
|
||
|
additional keyword arguments are forwarded to the ``Distribution()``
|
||
|
constructor.
|
||
|
|
||
|
``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
|
||
|
Create a distribution by setting its properties. All arguments are
|
||
|
optional and default to None, except for `py_version` (which defaults to
|
||
|
the current Python version) and `precedence` (which defaults to
|
||
|
``EGG_DIST``; for more details see ``precedence`` under `Distribution
|
||
|
Attributes`_ below). Note that it's usually easier to use the
|
||
|
``from_filename()`` or ``from_location()`` constructors than to specify
|
||
|
all these arguments individually.
|
||
|
|
||
|
|
||
|
``Distribution`` Attributes
|
||
|
---------------------------
|
||
|
|
||
|
location
|
||
|
A string indicating the distribution's location. For an importable
|
||
|
distribution, this is the string that would be added to ``sys.path`` to
|
||
|
make it actively importable. For non-importable distributions, this is
|
||
|
simply a filename, URL, or other way of locating the distribution.
|
||
|
|
||
|
project_name
|
||
|
A string, naming the project that this distribution is for. Project names
|
||
|
are defined by a project's setup script, and they are used to identify
|
||
|
projects on PyPI. When a ``Distribution`` is constructed, the
|
||
|
`project_name` argument is passed through the ``safe_name()`` utility
|
||
|
function to filter out any unacceptable characters.
|
||
|
|
||
|
key
|
||
|
``dist.key`` is short for ``dist.project_name.lower()``. It's used for
|
||
|
case-insensitive comparison and indexing of distributions by project name.
|
||
|
|
||
|
extras
|
||
|
A list of strings, giving the names of extra features defined by the
|
||
|
project's dependency list (the ``extras_require`` argument specified in
|
||
|
the project's setup script).
|
||
|
|
||
|
version
|
||
|
A string denoting what release of the project this distribution contains.
|
||
|
When a ``Distribution`` is constructed, the `version` argument is passed
|
||
|
through the ``safe_version()`` utility function to filter out any
|
||
|
unacceptable characters. If no `version` is specified at construction
|
||
|
time, then attempting to access this attribute later will cause the
|
||
|
``Distribution`` to try to discover its version by reading its ``PKG-INFO``
|
||
|
metadata file. If ``PKG-INFO`` is unavailable or can't be parsed,
|
||
|
``ValueError`` is raised.
|
||
|
|
||
|
parsed_version
|
||
|
The ``parsed_version`` is an object representing a "parsed" form of the
|
||
|
distribution's ``version``. ``dist.parsed_version`` is a shortcut for
|
||
|
calling ``parse_version(dist.version)``. It is used to compare or sort
|
||
|
distributions by version. (See the `Parsing Utilities`_ section below for
|
||
|
more information on the ``parse_version()`` function.) Note that accessing
|
||
|
``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
|
||
|
was constructed without a `version` and without `metadata` capable of
|
||
|
supplying the missing version info.
|
||
|
|
||
|
py_version
|
||
|
The major/minor Python version the distribution supports, as a string.
|
||
|
For example, "2.7" or "3.4". The default is the current version of Python.
|
||
|
|
||
|
platform
|
||
|
A string representing the platform the distribution is intended for, or
|
||
|
``None`` if the distribution is "pure Python" and therefore cross-platform.
|
||
|
See `Platform Utilities`_ below for more information on platform strings.
|
||
|
|
||
|
precedence
|
||
|
A distribution's ``precedence`` is used to determine the relative order of
|
||
|
two distributions that have the same ``project_name`` and
|
||
|
``parsed_version``. The default precedence is ``pkg_resources.EGG_DIST``,
|
||
|
which is the highest (i.e. most preferred) precedence. The full list
|
||
|
of predefined precedences, from most preferred to least preferred, is:
|
||
|
``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
|
||
|
``DEVELOP_DIST``. Normally, precedences other than ``EGG_DIST`` are used
|
||
|
only by the ``setuptools.package_index`` module, when sorting distributions
|
||
|
found in a package index to determine their suitability for installation.
|
||
|
"System" and "Development" eggs (i.e., ones that use the ``.egg-info``
|
||
|
format), however, are automatically given a precedence of ``DEVELOP_DIST``.
|
||
|
|
||
|
|
||
|
|
||
|
``Distribution`` Methods
|
||
|
------------------------
|
||
|
|
||
|
``activate(path=None)``
|
||
|
Ensure distribution is importable on `path`. If `path` is None,
|
||
|
``sys.path`` is used instead. This ensures that the distribution's
|
||
|
``location`` is in the `path` list, and it also performs any necessary
|
||
|
namespace package fixups or declarations. (That is, if the distribution
|
||
|
contains namespace packages, this method ensures that they are declared,
|
||
|
and that the distribution's contents for those namespace packages are
|
||
|
merged with the contents provided by any other active distributions. See
|
||
|
the section above on `Namespace Package Support`_ for more information.)
|
||
|
|
||
|
``pkg_resources`` adds a notification callback to the global ``working_set``
|
||
|
that ensures this method is called whenever a distribution is added to it.
|
||
|
Therefore, you should not normally need to explicitly call this method.
|
||
|
(Note that this means that namespace packages on ``sys.path`` are always
|
||
|
imported as soon as ``pkg_resources`` is, which is another reason why
|
||
|
namespace packages should not contain any code or import statements.)
|
||
|
|
||
|
``as_requirement()``
|
||
|
Return a ``Requirement`` instance that matches this distribution's project
|
||
|
name and version.
|
||
|
|
||
|
``requires(extras=())``
|
||
|
List the ``Requirement`` objects that specify this distribution's
|
||
|
dependencies. If `extras` is specified, it should be a sequence of names
|
||
|
of "extras" defined by the distribution, and the list returned will then
|
||
|
include any dependencies needed to support the named "extras".
|
||
|
|
||
|
``clone(**kw)``
|
||
|
Create a copy of the distribution. Any supplied keyword arguments override
|
||
|
the corresponding argument to the ``Distribution()`` constructor, allowing
|
||
|
you to change some of the copied distribution's attributes.
|
||
|
|
||
|
``egg_name()``
|
||
|
Return what this distribution's standard filename should be, not including
|
||
|
the ".egg" extension. For example, a distribution for project "Foo"
|
||
|
version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
|
||
|
of ``Foo-1.2-py2.3-win32``. Any dashes in the name or version are
|
||
|
converted to underscores. (``Distribution.from_location()`` will convert
|
||
|
them back when parsing a ".egg" file name.)
|
||
|
|
||
|
``__cmp__(other)``, ``__hash__()``
|
||
|
Distribution objects are hashed and compared on the basis of their parsed
|
||
|
version and precedence, followed by their key (lowercase project name),
|
||
|
location, Python version, and platform.
|
||
|
|
||
|
The following methods are used to access ``EntryPoint`` objects advertised
|
||
|
by the distribution. See the section above on `Entry Points`_ for more
|
||
|
detailed information about these operations:
|
||
|
|
||
|
``get_entry_info(group, name)``
|
||
|
Return the ``EntryPoint`` object for `group` and `name`, or None if no
|
||
|
such point is advertised by this distribution.
|
||
|
|
||
|
``get_entry_map(group=None)``
|
||
|
Return the entry point map for `group`. If `group` is None, return
|
||
|
a dictionary mapping group names to entry point maps for all groups.
|
||
|
(An entry point map is a dictionary of entry point names to ``EntryPoint``
|
||
|
objects.)
|
||
|
|
||
|
``load_entry_point(group, name)``
|
||
|
Short for ``get_entry_info(group, name).load()``. Returns the object
|
||
|
advertised by the named entry point, or raises ``ImportError`` if
|
||
|
the entry point isn't advertised by this distribution, or there is some
|
||
|
other import problem.
|
||
|
|
||
|
In addition to the above methods, ``Distribution`` objects also implement all
|
||
|
of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
|
||
|
documented in later sections):
|
||
|
|
||
|
* ``has_metadata(name)``
|
||
|
* ``metadata_isdir(name)``
|
||
|
* ``metadata_listdir(name)``
|
||
|
* ``get_metadata(name)``
|
||
|
* ``get_metadata_lines(name)``
|
||
|
* ``run_script(script_name, namespace)``
|
||
|
* ``get_resource_filename(manager, resource_name)``
|
||
|
* ``get_resource_stream(manager, resource_name)``
|
||
|
* ``get_resource_string(manager, resource_name)``
|
||
|
* ``has_resource(resource_name)``
|
||
|
* ``resource_isdir(resource_name)``
|
||
|
* ``resource_listdir(resource_name)``
|
||
|
|
||
|
If the distribution was created with a `metadata` argument, these resource and
|
||
|
metadata access methods are all delegated to that `metadata` provider.
|
||
|
Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
|
||
|
will appear to have no resources or metadata. This delegation approach is used
|
||
|
so that supporting custom importers or new distribution formats can be done
|
||
|
simply by creating an appropriate `IResourceProvider`_ implementation; see the
|
||
|
section below on `Supporting Custom Importers`_ for more details.
|
||
|
|
||
|
|
||
|
``ResourceManager`` API
|
||
|
=======================
|
||
|
|
||
|
The ``ResourceManager`` class provides uniform access to package resources,
|
||
|
whether those resources exist as files and directories or are compressed in
|
||
|
an archive of some kind.
|
||
|
|
||
|
Normally, you do not need to create or explicitly manage ``ResourceManager``
|
||
|
instances, as the ``pkg_resources`` module creates a global instance for you,
|
||
|
and makes most of its methods available as top-level names in the
|
||
|
``pkg_resources`` module namespace. So, for example, this code actually
|
||
|
calls the ``resource_string()`` method of the global ``ResourceManager``::
|
||
|
|
||
|
import pkg_resources
|
||
|
my_data = pkg_resources.resource_string(__name__, "foo.dat")
|
||
|
|
||
|
Thus, you can use the APIs below without needing an explicit
|
||
|
``ResourceManager`` instance; just import and use them as needed.
|
||
|
|
||
|
|
||
|
Basic Resource Access
|
||
|
---------------------
|
||
|
|
||
|
In the following methods, the `package_or_requirement` argument may be either
|
||
|
a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
|
||
|
If it is a package or module name, the named module or package must be
|
||
|
importable (i.e., be in a distribution or directory on ``sys.path``), and the
|
||
|
`resource_name` argument is interpreted relative to the named package. (Note
|
||
|
that if a module name is used, then the resource name is relative to the
|
||
|
package immediately containing the named module. Also, you should not use use
|
||
|
a namespace package name, because a namespace package can be spread across
|
||
|
multiple distributions, and is therefore ambiguous as to which distribution
|
||
|
should be searched for the resource.)
|
||
|
|
||
|
If it is a ``Requirement``, then the requirement is automatically resolved
|
||
|
(searching the current ``Environment`` if necessary) and a matching
|
||
|
distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
|
||
|
already present. (Unless the ``Requirement`` can't be satisfied, in which
|
||
|
case an exception is raised.) The `resource_name` argument is then interpreted
|
||
|
relative to the root of the identified distribution; i.e. its first path
|
||
|
segment will be treated as a peer of the top-level modules or packages in the
|
||
|
distribution.
|
||
|
|
||
|
Note that resource names must be ``/``-separated paths and cannot be absolute
|
||
|
(i.e. no leading ``/``) or contain relative names like ``".."``. Do *not* use
|
||
|
``os.path`` routines to manipulate resource paths, as they are *not* filesystem
|
||
|
paths.
|
||
|
|
||
|
``resource_exists(package_or_requirement, resource_name)``
|
||
|
Does the named resource exist? Return ``True`` or ``False`` accordingly.
|
||
|
|
||
|
``resource_stream(package_or_requirement, resource_name)``
|
||
|
Return a readable file-like object for the specified resource; it may be
|
||
|
an actual file, a ``StringIO``, or some similar object. The stream is
|
||
|
in "binary mode", in the sense that whatever bytes are in the resource
|
||
|
will be read as-is.
|
||
|
|
||
|
``resource_string(package_or_requirement, resource_name)``
|
||
|
Return the specified resource as a string. The resource is read in
|
||
|
binary fashion, such that the returned string contains exactly the bytes
|
||
|
that are stored in the resource.
|
||
|
|
||
|
``resource_isdir(package_or_requirement, resource_name)``
|
||
|
Is the named resource a directory? Return ``True`` or ``False``
|
||
|
accordingly.
|
||
|
|
||
|
``resource_listdir(package_or_requirement, resource_name)``
|
||
|
List the contents of the named resource directory, just like ``os.listdir``
|
||
|
except that it works even if the resource is in a zipfile.
|
||
|
|
||
|
Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
|
||
|
as to the resource type. You cannot use ``resource_listdir()`` on a file
|
||
|
resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
|
||
|
directory resources. Using an inappropriate method for the resource type may
|
||
|
result in an exception or undefined behavior, depending on the platform and
|
||
|
distribution format involved.
|
||
|
|
||
|
|
||
|
Resource Extraction
|
||
|
-------------------
|
||
|
|
||
|
``resource_filename(package_or_requirement, resource_name)``
|
||
|
Sometimes, it is not sufficient to access a resource in string or stream
|
||
|
form, and a true filesystem filename is needed. In such cases, you can
|
||
|
use this method (or module-level function) to obtain a filename for a
|
||
|
resource. If the resource is in an archive distribution (such as a zipped
|
||
|
egg), it will be extracted to a cache directory, and the filename within
|
||
|
the cache will be returned. If the named resource is a directory, then
|
||
|
all resources within that directory (including subdirectories) are also
|
||
|
extracted. If the named resource is a C extension or "eager resource"
|
||
|
(see the ``setuptools`` documentation for details), then all C extensions
|
||
|
and eager resources are extracted at the same time.
|
||
|
|
||
|
Archived resources are extracted to a cache location that can be managed by
|
||
|
the following two methods:
|
||
|
|
||
|
``set_extraction_path(path)``
|
||
|
Set the base path where resources will be extracted to, if needed.
|
||
|
|
||
|
If you do not call this routine before any extractions take place, the
|
||
|
path defaults to the return value of ``get_default_cache()``. (Which is
|
||
|
based on the ``PYTHON_EGG_CACHE`` environment variable, with various
|
||
|
platform-specific fallbacks. See that routine's documentation for more
|
||
|
details.)
|
||
|
|
||
|
Resources are extracted to subdirectories of this path based upon
|
||
|
information given by the resource provider. You may set this to a
|
||
|
temporary directory, but then you must call ``cleanup_resources()`` to
|
||
|
delete the extracted files when done. There is no guarantee that
|
||
|
``cleanup_resources()`` will be able to remove all extracted files. (On
|
||
|
Windows, for example, you can't unlink .pyd or .dll files that are still
|
||
|
in use.)
|
||
|
|
||
|
Note that you may not change the extraction path for a given resource
|
||
|
manager once resources have been extracted, unless you first call
|
||
|
``cleanup_resources()``.
|
||
|
|
||
|
``cleanup_resources(force=False)``
|
||
|
Delete all extracted resource files and directories, returning a list
|
||
|
of the file and directory names that could not be successfully removed.
|
||
|
This function does not have any concurrency protection, so it should
|
||
|
generally only be called when the extraction path is a temporary
|
||
|
directory exclusive to a single process. This method is not
|
||
|
automatically called; you must call it explicitly or register it as an
|
||
|
``atexit`` function if you wish to ensure cleanup of a temporary
|
||
|
directory used for extractions.
|
||
|
|
||
|
|
||
|
"Provider" Interface
|
||
|
--------------------
|
||
|
|
||
|
If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
|
||
|
for a new distribution archive format, you may need to use the following
|
||
|
``IResourceManager`` methods to co-ordinate extraction of resources to the
|
||
|
filesystem. If you're not implementing an archive format, however, you have
|
||
|
no need to use these methods. Unlike the other methods listed above, they are
|
||
|
*not* available as top-level functions tied to the global ``ResourceManager``;
|
||
|
you must therefore have an explicit ``ResourceManager`` instance to use them.
|
||
|
|
||
|
``get_cache_path(archive_name, names=())``
|
||
|
Return absolute location in cache for `archive_name` and `names`
|
||
|
|
||
|
The parent directory of the resulting path will be created if it does
|
||
|
not already exist. `archive_name` should be the base filename of the
|
||
|
enclosing egg (which may not be the name of the enclosing zipfile!),
|
||
|
including its ".egg" extension. `names`, if provided, should be a
|
||
|
sequence of path name parts "under" the egg's extraction location.
|
||
|
|
||
|
This method should only be called by resource providers that need to
|
||
|
obtain an extraction location, and only for names they intend to
|
||
|
extract, as it tracks the generated names for possible cleanup later.
|
||
|
|
||
|
``extraction_error()``
|
||
|
Raise an ``ExtractionError`` describing the active exception as interfering
|
||
|
with the extraction process. You should call this if you encounter any
|
||
|
OS errors extracting the file to the cache path; it will format the
|
||
|
operating system exception for you, and add other information to the
|
||
|
``ExtractionError`` instance that may be needed by programs that want to
|
||
|
wrap or handle extraction errors themselves.
|
||
|
|
||
|
``postprocess(tempname, filename)``
|
||
|
Perform any platform-specific postprocessing of `tempname`.
|
||
|
Resource providers should call this method ONLY after successfully
|
||
|
extracting a compressed resource. They must NOT call it on resources
|
||
|
that are already in the filesystem.
|
||
|
|
||
|
`tempname` is the current (temporary) name of the file, and `filename`
|
||
|
is the name it will be renamed to by the caller after this routine
|
||
|
returns.
|
||
|
|
||
|
|
||
|
Metadata API
|
||
|
============
|
||
|
|
||
|
The metadata API is used to access metadata resources bundled in a pluggable
|
||
|
distribution. Metadata resources are virtual files or directories containing
|
||
|
information about the distribution, such as might be used by an extensible
|
||
|
application or framework to connect "plugins". Like other kinds of resources,
|
||
|
metadata resource names are ``/``-separated and should not contain ``..`` or
|
||
|
begin with a ``/``. You should not use ``os.path`` routines to manipulate
|
||
|
resource paths.
|
||
|
|
||
|
The metadata API is provided by objects implementing the ``IMetadataProvider``
|
||
|
or ``IResourceProvider`` interfaces. ``Distribution`` objects implement this
|
||
|
interface, as do objects returned by the ``get_provider()`` function:
|
||
|
|
||
|
``get_provider(package_or_requirement)``
|
||
|
If a package name is supplied, return an ``IResourceProvider`` for the
|
||
|
package. If a ``Requirement`` is supplied, resolve it by returning a
|
||
|
``Distribution`` from the current working set (searching the current
|
||
|
``Environment`` if necessary and adding the newly found ``Distribution``
|
||
|
to the working set). If the named package can't be imported, or the
|
||
|
``Requirement`` can't be satisfied, an exception is raised.
|
||
|
|
||
|
NOTE: if you use a package name rather than a ``Requirement``, the object
|
||
|
you get back may not be a pluggable distribution, depending on the method
|
||
|
by which the package was installed. In particular, "development" packages
|
||
|
and "single-version externally-managed" packages do not have any way to
|
||
|
map from a package name to the corresponding project's metadata. Do not
|
||
|
write code that passes a package name to ``get_provider()`` and then tries
|
||
|
to retrieve project metadata from the returned object. It may appear to
|
||
|
work when the named package is in an ``.egg`` file or directory, but
|
||
|
it will fail in other installation scenarios. If you want project
|
||
|
metadata, you need to ask for a *project*, not a package.
|
||
|
|
||
|
|
||
|
``IMetadataProvider`` Methods
|
||
|
-----------------------------
|
||
|
|
||
|
The methods provided by objects (such as ``Distribution`` instances) that
|
||
|
implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:
|
||
|
|
||
|
``has_metadata(name)``
|
||
|
Does the named metadata resource exist?
|
||
|
|
||
|
``metadata_isdir(name)``
|
||
|
Is the named metadata resource a directory?
|
||
|
|
||
|
``metadata_listdir(name)``
|
||
|
List of metadata names in the directory (like ``os.listdir()``)
|
||
|
|
||
|
``get_metadata(name)``
|
||
|
Return the named metadata resource as a string. The data is read in binary
|
||
|
mode; i.e., the exact bytes of the resource file are returned.
|
||
|
|
||
|
``get_metadata_lines(name)``
|
||
|
Yield named metadata resource as list of non-blank non-comment lines. This
|
||
|
is short for calling ``yield_lines(provider.get_metadata(name))``. See the
|
||
|
section on `yield_lines()`_ below for more information on the syntax it
|
||
|
recognizes.
|
||
|
|
||
|
``run_script(script_name, namespace)``
|
||
|
Execute the named script in the supplied namespace dictionary. Raises
|
||
|
``ResolutionError`` if there is no script by that name in the ``scripts``
|
||
|
metadata directory. `namespace` should be a Python dictionary, usually
|
||
|
a module dictionary if the script is being run as a module.
|
||
|
|
||
|
|
||
|
Exceptions
|
||
|
==========
|
||
|
|
||
|
``pkg_resources`` provides a simple exception hierarchy for problems that may
|
||
|
occur when processing requests to locate and activate packages::
|
||
|
|
||
|
ResolutionError
|
||
|
DistributionNotFound
|
||
|
VersionConflict
|
||
|
UnknownExtra
|
||
|
|
||
|
ExtractionError
|
||
|
|
||
|
``ResolutionError``
|
||
|
This class is used as a base class for the other three exceptions, so that
|
||
|
you can catch all of them with a single "except" clause. It is also raised
|
||
|
directly for miscellaneous requirement-resolution problems like trying to
|
||
|
run a script that doesn't exist in the distribution it was requested from.
|
||
|
|
||
|
``DistributionNotFound``
|
||
|
A distribution needed to fulfill a requirement could not be found.
|
||
|
|
||
|
``VersionConflict``
|
||
|
The requested version of a project conflicts with an already-activated
|
||
|
version of the same project.
|
||
|
|
||
|
``UnknownExtra``
|
||
|
One of the "extras" requested was not recognized by the distribution it
|
||
|
was requested from.
|
||
|
|
||
|
``ExtractionError``
|
||
|
A problem occurred extracting a resource to the Python Egg cache. The
|
||
|
following attributes are available on instances of this exception:
|
||
|
|
||
|
manager
|
||
|
The resource manager that raised this exception
|
||
|
|
||
|
cache_path
|
||
|
The base directory for resource extraction
|
||
|
|
||
|
original_error
|
||
|
The exception instance that caused extraction to fail
|
||
|
|
||
|
|
||
|
Supporting Custom Importers
|
||
|
===========================
|
||
|
|
||
|
By default, ``pkg_resources`` supports normal filesystem imports, and
|
||
|
``zipimport`` importers. If you wish to use the ``pkg_resources`` features
|
||
|
with other (PEP 302-compatible) importers or module loaders, you may need to
|
||
|
register various handlers and support functions using these APIs:
|
||
|
|
||
|
``register_finder(importer_type, distribution_finder)``
|
||
|
Register `distribution_finder` to find distributions in ``sys.path`` items.
|
||
|
`importer_type` is the type or class of a PEP 302 "Importer" (``sys.path``
|
||
|
item handler), and `distribution_finder` is a callable that, when passed a
|
||
|
path item, the importer instance, and an `only` flag, yields
|
||
|
``Distribution`` instances found under that path item. (The `only` flag,
|
||
|
if true, means the finder should yield only ``Distribution`` objects whose
|
||
|
``location`` is equal to the path item provided.)
|
||
|
|
||
|
See the source of the ``pkg_resources.find_on_path`` function for an
|
||
|
example finder function.
|
||
|
|
||
|
``register_loader_type(loader_type, provider_factory)``
|
||
|
Register `provider_factory` to make ``IResourceProvider`` objects for
|
||
|
`loader_type`. `loader_type` is the type or class of a PEP 302
|
||
|
``module.__loader__``, and `provider_factory` is a function that, when
|
||
|
passed a module object, returns an `IResourceProvider`_ for that module,
|
||
|
allowing it to be used with the `ResourceManager API`_.
|
||
|
|
||
|
``register_namespace_handler(importer_type, namespace_handler)``
|
||
|
Register `namespace_handler` to declare namespace packages for the given
|
||
|
`importer_type`. `importer_type` is the type or class of a PEP 302
|
||
|
"importer" (sys.path item handler), and `namespace_handler` is a callable
|
||
|
with a signature like this::
|
||
|
|
||
|
def namespace_handler(importer, path_entry, moduleName, module):
|
||
|
# return a path_entry to use for child packages
|
||
|
|
||
|
Namespace handlers are only called if the relevant importer object has
|
||
|
already agreed that it can handle the relevant path item. The handler
|
||
|
should only return a subpath if the module ``__path__`` does not already
|
||
|
contain an equivalent subpath. Otherwise, it should return None.
|
||
|
|
||
|
For an example namespace handler, see the source of the
|
||
|
``pkg_resources.file_ns_handler`` function, which is used for both zipfile
|
||
|
importing and regular importing.
|
||
|
|
||
|
|
||
|
IResourceProvider
|
||
|
-----------------
|
||
|
|
||
|
``IResourceProvider`` is an abstract class that documents what methods are
|
||
|
required of objects returned by a `provider_factory` registered with
|
||
|
``register_loader_type()``. ``IResourceProvider`` is a subclass of
|
||
|
``IMetadataProvider``, so objects that implement this interface must also
|
||
|
implement all of the `IMetadataProvider Methods`_ as well as the methods
|
||
|
shown here. The `manager` argument to the methods below must be an object
|
||
|
that supports the full `ResourceManager API`_ documented above.
|
||
|
|
||
|
``get_resource_filename(manager, resource_name)``
|
||
|
Return a true filesystem path for `resource_name`, coordinating the
|
||
|
extraction with `manager`, if the resource must be unpacked to the
|
||
|
filesystem.
|
||
|
|
||
|
``get_resource_stream(manager, resource_name)``
|
||
|
Return a readable file-like object for `resource_name`.
|
||
|
|
||
|
``get_resource_string(manager, resource_name)``
|
||
|
Return a string containing the contents of `resource_name`.
|
||
|
|
||
|
``has_resource(resource_name)``
|
||
|
Does the package contain the named resource?
|
||
|
|
||
|
``resource_isdir(resource_name)``
|
||
|
Is the named resource a directory? Return a false value if the resource
|
||
|
does not exist or is not a directory.
|
||
|
|
||
|
``resource_listdir(resource_name)``
|
||
|
Return a list of the contents of the resource directory, ala
|
||
|
``os.listdir()``. Requesting the contents of a non-existent directory may
|
||
|
raise an exception.
|
||
|
|
||
|
Note, by the way, that your provider classes need not (and should not) subclass
|
||
|
``IResourceProvider`` or ``IMetadataProvider``! These classes exist solely
|
||
|
for documentation purposes and do not provide any useful implementation code.
|
||
|
You may instead wish to subclass one of the `built-in resource providers`_.
|
||
|
|
||
|
|
||
|
Built-in Resource Providers
|
||
|
---------------------------
|
||
|
|
||
|
``pkg_resources`` includes several provider classes that are automatically used
|
||
|
where appropriate. Their inheritance tree looks like this::
|
||
|
|
||
|
NullProvider
|
||
|
EggProvider
|
||
|
DefaultProvider
|
||
|
PathMetadata
|
||
|
ZipProvider
|
||
|
EggMetadata
|
||
|
EmptyProvider
|
||
|
FileMetadata
|
||
|
|
||
|
|
||
|
``NullProvider``
|
||
|
This provider class is just an abstract base that provides for common
|
||
|
provider behaviors (such as running scripts), given a definition for just
|
||
|
a few abstract methods.
|
||
|
|
||
|
``EggProvider``
|
||
|
This provider class adds in some egg-specific features that are common
|
||
|
to zipped and unzipped eggs.
|
||
|
|
||
|
``DefaultProvider``
|
||
|
This provider class is used for unpacked eggs and "plain old Python"
|
||
|
filesystem modules.
|
||
|
|
||
|
``ZipProvider``
|
||
|
This provider class is used for all zipped modules, whether they are eggs
|
||
|
or not.
|
||
|
|
||
|
``EmptyProvider``
|
||
|
This provider class always returns answers consistent with a provider that
|
||
|
has no metadata or resources. ``Distribution`` objects created without
|
||
|
a ``metadata`` argument use an instance of this provider class instead.
|
||
|
Since all ``EmptyProvider`` instances are equivalent, there is no need
|
||
|
to have more than one instance. ``pkg_resources`` therefore creates a
|
||
|
global instance of this class under the name ``empty_provider``, and you
|
||
|
may use it if you have need of an ``EmptyProvider`` instance.
|
||
|
|
||
|
``PathMetadata(path, egg_info)``
|
||
|
Create an ``IResourceProvider`` for a filesystem-based distribution, where
|
||
|
`path` is the filesystem location of the importable modules, and `egg_info`
|
||
|
is the filesystem location of the distribution's metadata directory.
|
||
|
`egg_info` should usually be the ``EGG-INFO`` subdirectory of `path` for an
|
||
|
"unpacked egg", and a ``ProjectName.egg-info`` subdirectory of `path` for
|
||
|
a "development egg". However, other uses are possible for custom purposes.
|
||
|
|
||
|
``EggMetadata(zipimporter)``
|
||
|
Create an ``IResourceProvider`` for a zipfile-based distribution. The
|
||
|
`zipimporter` should be a ``zipimport.zipimporter`` instance, and may
|
||
|
represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
|
||
|
a specific egg *within* a basket, or a zipfile egg (where the zipfile
|
||
|
itself is a ".egg"). It can also be a combination, such as a zipfile egg
|
||
|
that also contains other eggs.
|
||
|
|
||
|
``FileMetadata(path_to_pkg_info)``
|
||
|
Create an ``IResourceProvider`` that provides exactly one metadata
|
||
|
resource: ``PKG-INFO``. The supplied path should be a distutils PKG-INFO
|
||
|
file. This is basically the same as an ``EmptyProvider``, except that
|
||
|
requests for ``PKG-INFO`` will be answered using the contents of the
|
||
|
designated file. (This provider is used to wrap ``.egg-info`` files
|
||
|
installed by vendor-supplied system packages.)
|
||
|
|
||
|
|
||
|
Utility Functions
|
||
|
=================
|
||
|
|
||
|
In addition to its high-level APIs, ``pkg_resources`` also includes several
|
||
|
generally-useful utility routines. These routines are used to implement the
|
||
|
high-level APIs, but can also be quite useful by themselves.
|
||
|
|
||
|
|
||
|
Parsing Utilities
|
||
|
-----------------
|
||
|
|
||
|
``parse_version(version)``
|
||
|
Parsed a project's version string as defined by PEP 440. The returned
|
||
|
value will be an object that represents the version. These objects may
|
||
|
be compared to each other and sorted. The sorting algorithm is as defined
|
||
|
by PEP 440 with the addition that any version which is not a valid PEP 440
|
||
|
version will be considered less than any valid PEP 440 version and the
|
||
|
invalid versions will continue sorting using the original algorithm.
|
||
|
|
||
|
.. _yield_lines():
|
||
|
|
||
|
``yield_lines(strs)``
|
||
|
Yield non-empty/non-comment lines from a string/unicode or a possibly-
|
||
|
nested sequence thereof. If `strs` is an instance of ``basestring``, it
|
||
|
is split into lines, and each non-blank, non-comment line is yielded after
|
||
|
stripping leading and trailing whitespace. (Lines whose first non-blank
|
||
|
character is ``#`` are considered comment lines.)
|
||
|
|
||
|
If `strs` is not an instance of ``basestring``, it is iterated over, and
|
||
|
each item is passed recursively to ``yield_lines()``, so that an arbitrarily
|
||
|
nested sequence of strings, or sequences of sequences of strings can be
|
||
|
flattened out to the lines contained therein. So for example, passing
|
||
|
a file object or a list of strings to ``yield_lines`` will both work.
|
||
|
(Note that between each string in a sequence of strings there is assumed to
|
||
|
be an implicit line break, so lines cannot bridge two strings in a
|
||
|
sequence.)
|
||
|
|
||
|
This routine is used extensively by ``pkg_resources`` to parse metadata
|
||
|
and file formats of various kinds, and most other ``pkg_resources``
|
||
|
parsing functions that yield multiple values will use it to break up their
|
||
|
input. However, this routine is idempotent, so calling ``yield_lines()``
|
||
|
on the output of another call to ``yield_lines()`` is completely harmless.
|
||
|
|
||
|
``split_sections(strs)``
|
||
|
Split a string (or possibly-nested iterable thereof), yielding ``(section,
|
||
|
content)`` pairs found using an ``.ini``-like syntax. Each ``section`` is
|
||
|
a whitespace-stripped version of the section name ("``[section]``")
|
||
|
and each ``content`` is a list of stripped lines excluding blank lines and
|
||
|
comment-only lines. If there are any non-blank, non-comment lines before
|
||
|
the first section header, they're yielded in a first ``section`` of
|
||
|
``None``.
|
||
|
|
||
|
This routine uses ``yield_lines()`` as its front end, so you can pass in
|
||
|
anything that ``yield_lines()`` accepts, such as an open text file, string,
|
||
|
or sequence of strings. ``ValueError`` is raised if a malformed section
|
||
|
header is found (i.e. a line starting with ``[`` but not ending with
|
||
|
``]``).
|
||
|
|
||
|
Note that this simplistic parser assumes that any line whose first nonblank
|
||
|
character is ``[`` is a section heading, so it can't support .ini format
|
||
|
variations that allow ``[`` as the first nonblank character on other lines.
|
||
|
|
||
|
``safe_name(name)``
|
||
|
Return a "safe" form of a project's name, suitable for use in a
|
||
|
``Requirement`` string, as a distribution name, or a PyPI project name.
|
||
|
All non-alphanumeric runs are condensed to single "-" characters, such that
|
||
|
a name like "The $$$ Tree" becomes "The-Tree". Note that if you are
|
||
|
generating a filename from this value you should combine it with a call to
|
||
|
``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
|
||
|
See ``to_filename()``.
|
||
|
|
||
|
``safe_version(version)``
|
||
|
This will return the normalized form of any PEP 440 version, if the version
|
||
|
string is not PEP 440 compatible than it is similar to ``safe_name()``
|
||
|
except that spaces in the input become dots, and dots are allowed to exist
|
||
|
in the output. As with ``safe_name()``, if you are generating a filename
|
||
|
from this you should replace any "-" characters in the output with
|
||
|
underscores.
|
||
|
|
||
|
``safe_extra(extra)``
|
||
|
Return a "safe" form of an extra's name, suitable for use in a requirement
|
||
|
string or a setup script's ``extras_require`` keyword. This routine is
|
||
|
similar to ``safe_name()`` except that non-alphanumeric runs are replaced
|
||
|
by a single underbar (``_``), and the result is lowercased.
|
||
|
|
||
|
``to_filename(name_or_version)``
|
||
|
Escape a name or version string so it can be used in a dash-separated
|
||
|
filename (or ``#egg=name-version`` tag) without ambiguity. You
|
||
|
should only pass in values that were returned by ``safe_name()`` or
|
||
|
``safe_version()``.
|
||
|
|
||
|
|
||
|
Platform Utilities
|
||
|
------------------
|
||
|
|
||
|
``get_build_platform()``
|
||
|
Return this platform's identifier string. For Windows, the return value
|
||
|
is ``"win32"``, and for Mac OS X it is a string of the form
|
||
|
``"macosx-10.4-ppc"``. All other platforms return the same uname-based
|
||
|
string that the ``distutils.util.get_platform()`` function returns.
|
||
|
This string is the minimum platform version required by distributions built
|
||
|
on the local machine. (Backward compatibility note: setuptools versions
|
||
|
prior to 0.6b1 called this function ``get_platform()``, and the function is
|
||
|
still available under that name for backward compatibility reasons.)
|
||
|
|
||
|
``get_supported_platform()`` (New in 0.6b1)
|
||
|
This is the similar to ``get_build_platform()``, but is the maximum
|
||
|
platform version that the local machine supports. You will usually want
|
||
|
to use this value as the ``provided`` argument to the
|
||
|
``compatible_platforms()`` function.
|
||
|
|
||
|
``compatible_platforms(provided, required)``
|
||
|
Return true if a distribution built on the `provided` platform may be used
|
||
|
on the `required` platform. If either platform value is ``None``, it is
|
||
|
considered a wildcard, and the platforms are therefore compatible.
|
||
|
Likewise, if the platform strings are equal, they're also considered
|
||
|
compatible, and ``True`` is returned. Currently, the only non-equal
|
||
|
platform strings that are considered compatible are Mac OS X platform
|
||
|
strings with the same hardware type (e.g. ``ppc``) and major version
|
||
|
(e.g. ``10``) with the `provided` platform's minor version being less than
|
||
|
or equal to the `required` platform's minor version.
|
||
|
|
||
|
``get_default_cache()``
|
||
|
Determine the default cache location for extracting resources from zipped
|
||
|
eggs. This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
|
||
|
if set. Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
|
||
|
the user's "Application Data" directory. On all other systems, it returns
|
||
|
``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
|
||
|
set.
|
||
|
|
||
|
|
||
|
PEP 302 Utilities
|
||
|
-----------------
|
||
|
|
||
|
``get_importer(path_item)``
|
||
|
A deprecated alias for ``pkgutil.get_importer()``
|
||
|
|
||
|
|
||
|
File/Path Utilities
|
||
|
-------------------
|
||
|
|
||
|
``ensure_directory(path)``
|
||
|
Ensure that the parent directory (``os.path.dirname``) of `path` actually
|
||
|
exists, using ``os.makedirs()`` if necessary.
|
||
|
|
||
|
``normalize_path(path)``
|
||
|
Return a "normalized" version of `path`, such that two paths represent
|
||
|
the same filesystem location if they have equal ``normalized_path()``
|
||
|
values. Specifically, this is a shortcut for calling ``os.path.realpath``
|
||
|
and ``os.path.normcase`` on `path`. Unfortunately, on certain platforms
|
||
|
(notably Cygwin and Mac OS X) the ``normcase`` function does not accurately
|
||
|
reflect the platform's case-sensitivity, so there is always the possibility
|
||
|
of two apparently-different paths being equal on such platforms.
|
||
|
|
||
|
History
|
||
|
-------
|
||
|
|
||
|
0.6c9
|
||
|
* Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.
|
||
|
|
||
|
0.6c7
|
||
|
* Fix package precedence problem where single-version eggs installed in
|
||
|
``site-packages`` would take precedence over ``.egg`` files (or directories)
|
||
|
installed in ``site-packages``.
|
||
|
|
||
|
0.6c6
|
||
|
* Fix extracted C extensions not having executable permissions under Cygwin.
|
||
|
|
||
|
* Allow ``.egg-link`` files to contain relative paths.
|
||
|
|
||
|
* Fix cache dir defaults on Windows when multiple environment vars are needed
|
||
|
to construct a path.
|
||
|
|
||
|
0.6c4
|
||
|
* Fix "dev" versions being considered newer than release candidates.
|
||
|
|
||
|
0.6c3
|
||
|
* Python 2.5 compatibility fixes.
|
||
|
|
||
|
0.6c2
|
||
|
* Fix a problem with eggs specified directly on ``PYTHONPATH`` on
|
||
|
case-insensitive filesystems possibly not showing up in the default
|
||
|
working set, due to differing normalizations of ``sys.path`` entries.
|
||
|
|
||
|
0.6b3
|
||
|
* Fixed a duplicate path insertion problem on case-insensitive filesystems.
|
||
|
|
||
|
0.6b1
|
||
|
* Split ``get_platform()`` into ``get_supported_platform()`` and
|
||
|
``get_build_platform()`` to work around a Mac versioning problem that caused
|
||
|
the behavior of ``compatible_platforms()`` to be platform specific.
|
||
|
|
||
|
* Fix entry point parsing when a standalone module name has whitespace
|
||
|
between it and the extras.
|
||
|
|
||
|
0.6a11
|
||
|
* Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
|
||
|
cache permission problems get a more user-friendly explanation of the
|
||
|
problem, and so that programs can catch and handle extraction errors if they
|
||
|
need to.
|
||
|
|
||
|
0.6a10
|
||
|
* Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
|
||
|
method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
|
||
|
to ``Environment``.
|
||
|
|
||
|
* ``safe_name()`` now allows dots in project names.
|
||
|
|
||
|
* There is a new ``to_filename()`` function that escapes project names and
|
||
|
versions for safe use in constructing egg filenames from a Distribution
|
||
|
object's metadata.
|
||
|
|
||
|
* Added ``Distribution.clone()`` method, and keyword argument support to other
|
||
|
``Distribution`` constructors.
|
||
|
|
||
|
* Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
|
||
|
eggs using ``.egg-info`` format.
|
||
|
|
||
|
0.6a9
|
||
|
* Don't raise an error when an invalid (unfinished) distribution is found
|
||
|
unless absolutely necessary. Warn about skipping invalid/unfinished eggs
|
||
|
when building an Environment.
|
||
|
|
||
|
* Added support for ``.egg-info`` files or directories with version/platform
|
||
|
information embedded in the filename, so that system packagers have the
|
||
|
option of including ``PKG-INFO`` files to indicate the presence of a
|
||
|
system-installed egg, without needing to use ``.egg`` directories, zipfiles,
|
||
|
or ``.pth`` manipulation.
|
||
|
|
||
|
* Changed ``parse_version()`` to remove dashes before pre-release tags, so
|
||
|
that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
|
||
|
to ``0.2rc1``. The idea that a dash *always* meant a post-release version
|
||
|
was highly non-intuitive to setuptools users and Python developers, who
|
||
|
seem to want to use ``-rc`` version numbers a lot.
|
||
|
|
||
|
0.6a8
|
||
|
* Fixed a problem with ``WorkingSet.resolve()`` that prevented version
|
||
|
conflicts from being detected at runtime.
|
||
|
|
||
|
* Improved runtime conflict warning message to identify a line in the user's
|
||
|
program, rather than flagging the ``warn()`` call in ``pkg_resources``.
|
||
|
|
||
|
* Avoid giving runtime conflict warnings for namespace packages, even if they
|
||
|
were declared by a different package than the one currently being activated.
|
||
|
|
||
|
* Fix path insertion algorithm for case-insensitive filesystems.
|
||
|
|
||
|
* Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
|
||
|
being set as an attribute of their parent package.
|
||
|
|
||
|
0.6a6
|
||
|
* Activated distributions are now inserted in ``sys.path`` (and the working
|
||
|
set) just before the directory that contains them, instead of at the end.
|
||
|
This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
|
||
|
the same location, and allows eggs found earlier on ``sys.path`` to override
|
||
|
ones found later.
|
||
|
|
||
|
* When a distribution is activated, it now checks whether any contained
|
||
|
non-namespace modules have already been imported and issues a warning if
|
||
|
a conflicting module has already been imported.
|
||
|
|
||
|
* Changed dependency processing so that it's breadth-first, allowing a
|
||
|
depender's preferences to override those of a dependee, to prevent conflicts
|
||
|
when a lower version is acceptable to the dependee, but not the depender.
|
||
|
|
||
|
* Fixed a problem extracting zipped files on Windows, when the egg in question
|
||
|
has had changed contents but still has the same version number.
|
||
|
|
||
|
0.6a4
|
||
|
* Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.
|
||
|
|
||
|
0.6a3
|
||
|
* Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
|
||
|
EntryPoint, and Distribution objects' extras handling.
|
||
|
|
||
|
0.6a1
|
||
|
* Enhanced performance of ``require()`` and related operations when all
|
||
|
requirements are already in the working set, and enhanced performance of
|
||
|
directory scanning for distributions.
|
||
|
|
||
|
* Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
|
||
|
``zipimport``, and the previously-broken "eager resource" support.
|
||
|
|
||
|
* Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
|
||
|
some other resource API bugs.
|
||
|
|
||
|
* Many API changes and enhancements:
|
||
|
|
||
|
* Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
|
||
|
``get_entry_info`` APIs for dynamic plugin discovery.
|
||
|
|
||
|
* ``list_resources`` is now ``resource_listdir`` (and it actually works)
|
||
|
|
||
|
* Resource API functions like ``resource_string()`` that accepted a package
|
||
|
name and resource name, will now also accept a ``Requirement`` object in
|
||
|
place of the package name (to allow access to non-package data files in
|
||
|
an egg).
|
||
|
|
||
|
* ``get_provider()`` will now accept a ``Requirement`` instance or a module
|
||
|
name. If it is given a ``Requirement``, it will return a corresponding
|
||
|
``Distribution`` (by calling ``require()`` if a suitable distribution
|
||
|
isn't already in the working set), rather than returning a metadata and
|
||
|
resource provider for a specific module. (The difference is in how
|
||
|
resource paths are interpreted; supplying a module name means resources
|
||
|
path will be module-relative, rather than relative to the distribution's
|
||
|
root.)
|
||
|
|
||
|
* ``Distribution`` objects now implement the ``IResourceProvider`` and
|
||
|
``IMetadataProvider`` interfaces, so you don't need to reference the (no
|
||
|
longer available) ``metadata`` attribute to get at these interfaces.
|
||
|
|
||
|
* ``Distribution`` and ``Requirement`` both have a ``project_name``
|
||
|
attribute for the project name they refer to. (Previously these were
|
||
|
``name`` and ``distname`` attributes.)
|
||
|
|
||
|
* The ``path`` attribute of ``Distribution`` objects is now ``location``,
|
||
|
because it isn't necessarily a filesystem path (and hasn't been for some
|
||
|
time now). The ``location`` of ``Distribution`` objects in the filesystem
|
||
|
should always be normalized using ``pkg_resources.normalize_path()``; all
|
||
|
of the setuptools and EasyInstall code that generates distributions from
|
||
|
the filesystem (including ``Distribution.from_filename()``) ensure this
|
||
|
invariant, but if you use a more generic API like ``Distribution()`` or
|
||
|
``Distribution.from_location()`` you should take care that you don't
|
||
|
create a distribution with an un-normalized filesystem path.
|
||
|
|
||
|
* ``Distribution`` objects now have an ``as_requirement()`` method that
|
||
|
returns a ``Requirement`` for the distribution's project name and version.
|
||
|
|
||
|
* Distribution objects no longer have an ``installed_on()`` method, and the
|
||
|
``install_on()`` method is now ``activate()`` (but may go away altogether
|
||
|
soon). The ``depends()`` method has also been renamed to ``requires()``,
|
||
|
and ``InvalidOption`` is now ``UnknownExtra``.
|
||
|
|
||
|
* ``find_distributions()`` now takes an additional argument called ``only``,
|
||
|
that tells it to only yield distributions whose location is the passed-in
|
||
|
path. (It defaults to False, so that the default behavior is unchanged.)
|
||
|
|
||
|
* ``AvailableDistributions`` is now called ``Environment``, and the
|
||
|
``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
|
||
|
because they weren't particularly useful. ``__getitem__()`` no longer
|
||
|
raises ``KeyError``; it just returns an empty list if there are no
|
||
|
distributions for the named project.
|
||
|
|
||
|
* The ``resolve()`` method of ``Environment`` is now a method of
|
||
|
``WorkingSet`` instead, and the ``best_match()`` method now uses a working
|
||
|
set instead of a path list as its second argument.
|
||
|
|
||
|
* There is a new ``pkg_resources.add_activation_listener()`` API that lets
|
||
|
you register a callback for notifications about distributions added to
|
||
|
``sys.path`` (including the distributions already on it). This is
|
||
|
basically a hook for extensible applications and frameworks to be able to
|
||
|
search for plugin metadata in distributions added at runtime.
|
||
|
|
||
|
0.5a13
|
||
|
* Fixed a bug in resource extraction from nested packages in a zipped egg.
|
||
|
|
||
|
0.5a12
|
||
|
* Updated extraction/cache mechanism for zipped resources to avoid inter-
|
||
|
process and inter-thread races during extraction. The default cache
|
||
|
location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
|
||
|
and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
|
||
|
current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
|
||
|
variable isn't set.
|
||
|
|
||
|
0.5a10
|
||
|
* Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
|
||
|
``sys.path`` (e.g. if a user deletes an egg without removing it from the
|
||
|
``easy-install.pth`` file).
|
||
|
|
||
|
* Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
|
||
|
never actually went inside ``.egg`` files.
|
||
|
|
||
|
* Made ``pkg_resources`` import the module you request resources from, if it's
|
||
|
not already imported.
|
||
|
|
||
|
0.5a4
|
||
|
* ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
|
||
|
accept an ``installer`` argument: a callable taking one argument, a
|
||
|
``Requirement`` instance. The callable must return a ``Distribution``
|
||
|
object, or ``None`` if no distribution is found. This feature is used by
|
||
|
EasyInstall to resolve dependencies by recursively invoking itself.
|
||
|
|
||
|
0.4a4
|
||
|
* Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
|
||
|
directory extraction for zipped eggs.
|
||
|
|
||
|
0.4a3
|
||
|
* Fixed scripts not being able to see a ``__file__`` variable in ``__main__``
|
||
|
|
||
|
* Fixed a problem with ``resource_isdir()`` implementation that was introduced
|
||
|
in 0.4a2.
|
||
|
|
||
|
0.4a1
|
||
|
* Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
|
||
|
``!=``) when only one condition was included.
|
||
|
|
||
|
* Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
|
||
|
arbitrary distribution names and versions found on PyPI.
|
||
|
|
||
|
0.3a4
|
||
|
* ``pkg_resources`` now supports resource directories, not just the resources
|
||
|
in them. In particular, there are ``resource_listdir()`` and
|
||
|
``resource_isdir()`` APIs.
|
||
|
|
||
|
* ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
|
||
|
multiple distributions in subdirectories whose names end with ``.egg``.
|
||
|
Having such a "basket" in a directory on ``sys.path`` is equivalent to
|
||
|
having the individual eggs in that directory, but the contained eggs can
|
||
|
be individually added (or not) to ``sys.path``. Currently, however, there
|
||
|
is no automated way to create baskets.
|
||
|
|
||
|
* Namespace package manipulation is now protected by the Python import lock.
|
||
|
|
||
|
0.3a1
|
||
|
* Initial release.
|
||
|
|