Python Enhancement Proposals

PEP 250 – Using site-packages on Windows

Using site-packages on Windows
p.f.moore at (Paul Moore)
Standards Track



The standard Python distribution includes a directory Lib/site-packages, which is used on Unix platforms to hold locally installed modules and packages. The 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.


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, or in a suitable, 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.


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

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

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

    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.


  • 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.


Last modified: 2021-02-03 14:06:23 GMT