Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

On a Ubuntu (10.10) system, I have a Python package that installs itself into /usr/local/lib/python2.6/site-packages/. This isn't contained in the default path (sys.path). How do I add this directory to the path?

Setting the $PYTHONPATH environment variable is a solution, of course, but I'm looking for a more elegant way to do this. For example easy_install also puts installed packages in it, my sys.path looks something like this:

['', '/usr/local/lib/python2.6/dist-packages/keyring-0.5.1-py2.6.egg', 
'/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk',  
'/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', 
'/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', 
'/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', 
'/usr/lib/pymodules/python2.6/gtk-2.0']

so the path is obviously not the default built into the Python binary.

Is there a single config file that contains the entries above? Or in what ways is it possible to modify it?

share|improve this question
up vote 18 down vote accepted
+50

The site module documentation and Modifying Python's Search Path seem to be what you're looking for.

As far as I understand it, those entries are being added to sys.path by:

  • /usr/lib/python2.6/site.py
  • /usr/lib/python2.6/dist-packages/site.py
    (Change 2.6 to your version of Python.)

The easiest way to change it is to add a file /usr/local/lib/python2.6/dist-packages/site-packages.pth containing ../site-packages.

Alternatively, maybe you can teach the package to use site.getsitepackages()?

share|improve this answer
1  
thanks, works perfectly :) (I ended up adding a .pth file to /usr/local/python2.6/dist-packages, containing "../site-packages") – Latanius Feb 18 '11 at 21:40
1  
You can also create a module called sitecustomize.py which site.py tries to import and modify sys.path there. – TestUser16418 Feb 18 '11 at 22:11

You might create a new file called /etc/profile.d/local_python.sh with the contents

PYTHONPATH="/usr/local/lib/python2.6/site-packages/":"${PYTHONPATH}"
export PYTHONPATH

Which will set the PYTHONPATH variable for all logged in users on your system.

share|improve this answer
6  
This really isn't universal. The /etc/profile.d mechanism will only work for login shells for people with shells that use /etc/profile.d (bash/ksh/zsh). I'm sure csh users won't see this change. Also, will be ignored in cron/at jobs. – Rich Homolka Feb 18 '11 at 21:43
2  
this is a nice way to set global environment variables (yet another thing I learned today), but as I mentioned in the post, I was looking for a more Pythonic way :) – Latanius Feb 18 '11 at 21:45

For example, if you want to import the suds module which is available as .egg file:

egg_path='/home/shahid/suds_2.4.egg'

sys.path.append(egg_path)

import suds

... rest of code

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .