python-peps/pep-0365/index.html

221 lines
15 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<title>PEP 365 Adding the pkg_resources module | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0365/">
<link rel="stylesheet" href="../_static/style.css" type="text/css">
<link rel="stylesheet" href="../_static/mq.css" type="text/css">
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light">
<link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark">
<link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss">
<meta property="og:title" content='PEP 365 Adding the pkg_resources module | peps.python.org'>
<meta property="og:description" content="This PEP proposes adding an enhanced version of the pkg_resources module to the standard library.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0365/">
<meta property="og:site_name" content="Python Enhancement Proposals (PEPs)">
<meta property="og:image" content="https://peps.python.org/_static/og-image.png">
<meta property="og:image:alt" content="Python PEPs">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="description" content="This PEP proposes adding an enhanced version of the pkg_resources module to the standard library.">
<meta name="theme-color" content="#3776ab">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all">
<title>Following system colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="9"></circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all">
<title>Selected dark colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all">
<title>Selected light colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
</svg>
<script>
document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto"
</script>
<section id="pep-page-section">
<header>
<h1>Python Enhancement Proposals</h1>
<ul class="breadcrumbs">
<li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> &raquo; </li>
<li><a href="../pep-0000/">PEP Index</a> &raquo; </li>
<li>PEP 365</li>
</ul>
<button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())">
<svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg>
<span class="visually-hidden">Toggle light / dark / auto colour theme</span>
</button>
</header>
<article>
<section id="pep-content">
<h1 class="page-title">PEP 365 Adding the pkg_resources module</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">Phillip J. Eby &lt;pje&#32;&#97;t&#32;telecommunity.com&gt;</dd>
<dt class="field-even">Status<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Formally declined and will not be accepted">Rejected</abbr></dd>
<dt class="field-odd">Type<span class="colon">:</span></dt>
<dd class="field-odd"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd>
<dt class="field-even">Topic<span class="colon">:</span></dt>
<dd class="field-even"><a class="reference external" href="../topic/packaging/">Packaging</a></dd>
<dt class="field-odd">Created<span class="colon">:</span></dt>
<dd class="field-odd">30-Apr-2007</dd>
<dt class="field-even">Post-History<span class="colon">:</span></dt>
<dd class="field-even">30-Apr-2007</dd>
</dl>
<hr class="docutils" />
<section id="contents">
<details><summary>Table of Contents</summary><ul class="simple">
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#implementation-and-documentation">Implementation and Documentation</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
</details></section>
<section id="abstract">
<h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2>
<p>This PEP proposes adding an enhanced version of the <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code>
module to the standard library.</p>
<p><code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> is a module used to find and manage Python
package/version dependencies and access bundled files and resources,
including those inside of zipped <code class="docutils literal notranslate"><span class="pre">.egg</span></code> files. Currently,
<code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> is only available through installing the entire
<code class="docutils literal notranslate"><span class="pre">setuptools</span></code> distribution, but it does not depend on any other part
of setuptools; in effect, it comprises the entire runtime support
library for Python Eggs, and is independently useful.</p>
<p>In addition, with one feature addition, this module could support
easy bootstrap installation of several Python package management
tools, including <code class="docutils literal notranslate"><span class="pre">setuptools</span></code>, <code class="docutils literal notranslate"><span class="pre">workingenv</span></code>, and <code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>.</p>
</section>
<section id="proposal">
<h2><a class="toc-backref" href="#proposal" role="doc-backlink">Proposal</a></h2>
<p>Rather than proposing to include <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> in the standard
library, this PEP proposes only that <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> be added to the
standard library for Python 2.6 and 3.0. <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> is
considerably more stable than the rest of setuptools, with virtually
no new features being added in the last 12 months.</p>
<p>However, this PEP also proposes that a new feature be added to
<code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code>, before being added to the stdlib. Specifically, it
should be possible to do something like:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">pkg_resources</span> <span class="n">SomePackage</span><span class="o">==</span><span class="mf">1.2</span>
</pre></div>
</div>
<p>to request downloading and installation of <code class="docutils literal notranslate"><span class="pre">SomePackage</span></code> from PyPI.
This feature would <em>not</em> be a replacement for <code class="docutils literal notranslate"><span class="pre">easy_install</span></code>;
instead, it would rely on <code class="docutils literal notranslate"><span class="pre">SomePackage</span></code> having pure-Python <code class="docutils literal notranslate"><span class="pre">.egg</span></code>
files listed for download via the PyPI XML-RPC API, and the eggs would
be placed in the <code class="docutils literal notranslate"><span class="pre">$PYTHON_EGG_CACHE</span></code> directory, where they would
<strong>not</strong> be importable by default. (And no scripts would be installed.)
However, if the download egg contains installation bootstrap code, it
will be given a chance to run.</p>
<p>These restrictions would allow the code to be extremely simple, yet
still powerful enough to support users downloading package management
tools such as <code class="docutils literal notranslate"><span class="pre">setuptools</span></code>, <code class="docutils literal notranslate"><span class="pre">workingenv</span></code> and <code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>,
simply by supplying the tools name on the command line.</p>
</section>
<section id="rationale">
<h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2>
<p>Many users have requested that <code class="docutils literal notranslate"><span class="pre">setuptools</span></code> be included in the
standard library, to save users needing to go through the awkward
process of bootstrapping it. However, most of the bootstrapping
complexity comes from the fact that setuptools-installed code cannot
use the <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> runtime module unless setuptools is already
installed. Thus, installing setuptools requires (in a sense) that
setuptools already be installed.</p>
<p>Other Python package management tools, such as <code class="docutils literal notranslate"><span class="pre">workingenv</span></code> and
<code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>, have similar bootstrapping issues, since they both
make use of setuptools, but also want to provide users with something
approaching a “one-step install”. The complexity of creating bootstrap
utilities for these and any other such tools that arise in future, is
greatly reduced if <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> is already present, and is also
able to download pre-packaged eggs from PyPI.</p>
<p>(It would also mean that setuptools would not need to be installed
in order to simply <em>use</em> eggs, as opposed to building them.)</p>
<p>Finally, in addition to providing access to eggs built via setuptools
or other packaging tools, it should be noted that since Python 2.5,
the distutils install package metadata (aka <code class="docutils literal notranslate"><span class="pre">PKG-INFO</span></code>) files that
can be read by <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> to identify what distributions are
already on <code class="docutils literal notranslate"><span class="pre">sys.path</span></code>. In environments where Python packages are
installed using system package tools (like RPM), the <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code>
module provides an API for detecting what versions of what packages
are installed, even if those packages were installed via the distutils
instead of setuptools.</p>
</section>
<section id="implementation-and-documentation">
<h2><a class="toc-backref" href="#implementation-and-documentation" role="doc-backlink">Implementation and Documentation</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> implementation is maintained in the Python
SVN repository under <code class="docutils literal notranslate"><span class="pre">/sandbox/trunk/setuptools/</span></code>; see
<code class="docutils literal notranslate"><span class="pre">pkg_resources.py</span></code> and <code class="docutils literal notranslate"><span class="pre">pkg_resources.txt</span></code>. Documentation for the
egg format(s) supported by <code class="docutils literal notranslate"><span class="pre">pkg_resources</span></code> can be found in
<code class="docutils literal notranslate"><span class="pre">doc/formats.txt</span></code>. HTML versions of these documents are available
at:</p>
<ul class="simple">
<li><a class="reference external" href="http://peak.telecommunity.com/DevCenter/PkgResources">http://peak.telecommunity.com/DevCenter/PkgResources</a> and</li>
<li><a class="reference external" href="http://peak.telecommunity.com/DevCenter/EggFormats">http://peak.telecommunity.com/DevCenter/EggFormats</a></li>
</ul>
<p>(These HTML versions are for setuptools 0.6; they may not reflect all
of the changes found in the Subversion trunks <code class="docutils literal notranslate"><span class="pre">.txt</span></code> versions.)</p>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0365.rst">https://github.com/python/peps/blob/main/peps/pep-0365.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0365.rst">2023-09-09 17:39:29 GMT</a></p>
</article>
<nav id="pep-sidebar">
<h2>Contents</h2>
<ul>
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#implementation-and-documentation">Implementation and Documentation</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
<br>
<a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0365.rst">Page Source (GitHub)</a>
</nav>
</section>
<script src="../_static/colour_scheme.js"></script>
<script src="../_static/wrap_tables.js"></script>
<script src="../_static/sticky_banner.js"></script>
</body>
</html>