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', 

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?

4 Answers 4


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()?

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

I'd like to summarize my findings about python's path modification. There are two ways to do it.

  • .pth file

Any .pth file which is found on the default path (see bellow) will get its content included into sys.path. Format of said .pth file is simple: one (folder) path per line. Surprisingly, the paths can be absolute or relative to the .pth file.

Default path is where the interpreter resides and <some-prefix>/lib/python<version>/site-packages where <some-prefix> is usually /usr/.

PYTHONPATH is environmental variable of your operating system. On unix systems you list them by env. Global modification of such variables is done through .sh scripts inside /etc/profile.d/ folder as mentioned by @TestUser16418.

  • 2
    It is PYTHONPATH without "_"
    – heroxbd
    Jul 9, 2017 at 4:57

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


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

  • 7
    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. Feb 18, 2011 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, 2011 at 21:45

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

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


import suds
# ... rest of code

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.