Creating a secondary site-packages directory (and loading packages from .pth files therein)

mbauman picture mbauman · May 22, 2012 · Viewed 7k times · Source

I would like to install some packages into a third-party site-packages directory (beyond the standard system locations). Is there any way to set this up such that .pth files therein are respected?


Background: I'm using OS X, virtualenv, and homebrew. There are a few packages (notably wxPython in my case) that do not install nicely through pip into virtualenv. In these cases, there are homebrew packages that work in their stead. Homebrew creates a third site-packages folder in /usr/local/lib/python2.7. I'd like to simply point to this folder and leave the maintenance of all items there under brew's control. It seems, however, that this is not possible.

I'm certainly not the only one interested in this issue. I'd wager a good number of the generic 'pth files not working' questions and posts online that I've stumbled across are related to this issue. Is there a good solution?

Answer

Andrew Clark picture Andrew Clark · May 22, 2012

Take a look at the site module. It provides the function addsitedir which should do what you want.

The easiest way to use this would be to create a file named sitecustomize.py or usercustomize.py and place it in a current PYTHONPATH directory (or any directory that ends up on sys.path) with the following contents:

import site
site.addsitedir('/usr/local/lib/python2.7')

When Python is starting an attempt is made to import sitecustomize and then usercustomize, which is why this works. From the site documentation:

After these path manipulations, an attempt is made to import a module named sitecustomize, which can perform arbitrary site-specific customizations. It is typically created by a system administrator in the site-packages directory. If this import fails with an ImportError exception, it is silently ignored.

After this, an attempt is made to import a module named usercustomize, which can perform arbitrary user-specific customizations, if ENABLE_USER_SITE is true. This file is intended to be created in the user site-packages directory (see below), which is part of sys.path unless disabled by -s. An ImportError will be silently ignored.