PEP: 250 Title: Using site-packages on Windows Author: Paul Moore
<p.f.moore@gmail.com> Status: Final Type: Standards Track Content-Type:
text/x-rst Created: 30-Mar-2001 Python-Version: 2.2 Post-History:
30-Mar-2001

Abstract

The standard Python distribution includes a directory Lib/site-packages,
which is used on Unix platforms to hold locally installed modules and
packages. The site.py module distributed with Python includes support
for locating other modules in the site-packages directory.

This PEP proposes that the site-packages directory should be used on the
Windows platform in a similar manner.

Motivation

On Windows platforms, the default setting for sys.path does not include
a directory suitable for users to install locally developed modules. The
"expected" location appears to be the directory containing the Python
executable itself. This is also the location where distutils (and
distutils-generated installers) installs packages. Including locally
developed code in the same directory as installed executables is not
good practice.

Clearly, users can manipulate sys.path, either in a locally modified
site.py, or in a suitable sitecustomize.py, or even via .pth files.
However, there should be a standard location for such files, rather than
relying on every individual site having to set their own policy.

In addition, with distutils becoming more prevalent as a means of
distributing modules, the need for a standard install location for
distributed modules will become more common. It would be better to
define such a standard now, rather than later when more distutils-based
packages exist which will need rebuilding.

It is relevant to note that prior to Python 2.1, the site-packages
directory was not included in sys.path for Macintosh platforms. This has
been changed in 2.1, and Macintosh includes sys.path now, leaving
Windows as the only major platform with no site-specific modules
directory.

Implementation

The implementation of this feature is fairly trivial. All that would be
required is a change to site.py, to change the section setting sitedirs.
The Python 2.1 version has:

    if os.sep == '/':
        sitedirs = [makepath(prefix,
                            "lib",
                            "python" + sys.version[:3],
                            "site-packages"),
                    makepath(prefix, "lib", "site-python")]
    elif os.sep == ':':
        sitedirs = [makepath(prefix, "lib", "site-packages")]
    else:
        sitedirs = [prefix]

A suitable change would be to simply replace the last 4 lines with:

    else:
        sitedirs == [prefix, makepath(prefix, "lib", "site-packages")]

Changes would also be required to distutils, to reflect this change in
policy. A patch is available on Sourceforge, patch ID 445744, which
implements this change. Note that the patch checks the Python version
and only invokes the new behaviour for Python versions from 2.2 onwards.
This is to ensure that distutils remains compatible with earlier
versions of Python.

Finally, the executable code which implements the Windows installer used
by the bdist_wininst command will need changing to use the new location.
A separate patch is available for this, currently maintained by Thomas
Heller.

Notes

-   This change does not preclude packages using the current location --
    the change only adds a directory to sys.path, it does not remove
    anything.
-   Both the current location (sys.prefix) and the new directory
    (site-packages) are included in sitedirs, so that .pth files will be
    recognised in either location.
-   This proposal adds a single additional site-packages directory to
    sitedirs. On Unix platforms, two directories are added, one for
    version-independent files (Python code) and one for
    version-dependent code (C extensions). This is necessary on Unix, as
    the sitedirs include a common (across Python versions) package
    location, in /usr/local by default. As there is no such common
    location available on Windows, there is also no need for having two
    separate package directories.
-   If users want to keep DLLs in a single location on Windows, rather
    than keeping them in the package directory, the DLLs subdirectory of
    the Python install directory is already available for that purpose.
    Adding an extra directory solely for DLLs should not be necessary.

Open Issues

-   Comments from Unix users indicate that there may be issues with the
    current setup on the Unix platform. Rather than become involved in
    cross-platform issues, this PEP specifically limits itself to the
    Windows platform, leaving changes for other platforms to be covered
    in other PEPs.
-   There could be issues with applications which embed Python. To the
    author's knowledge, there should be no problem as a result of this
    change. There have been no comments (supportive or otherwise) from
    users who embed Python.

Copyright

This document has been placed in the public domain.