11
votes

Environment: debian 4.0

Python 2.4

My 'project' is installed in:

/usr/lib/python2.4/site-packages/project.

But I want to use my working copy instead of the installed one which is located in:

/home/me/dev/project/src

So what I do is:

export PYTHONPATH=/home/me/dev/project/src

ipython

import foo # which is in src

foo.__file__

*/usr/lib/python2.4/site-packages/project/foo.py*

instead of :

/home/me/dev/project/src/project/foo.py

How come? I try to check the pathes (having done the export above) and what I see is:

import sys,os

sys.path

['', '/usr/bin', '/usr/lib/python2.4/site-packages', '/home/me/dev/project/src', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/PIL', '/var/lib/python-support/python2.4', '/usr/lib/python2.4/site-packages/IPython/Extensions', '/home/me/.ipython']

os.environ['PYTHONPATH']

/home/me/dev/project/src

7
Machine working properly: > export PYTHONPATH=foo > ipython > import sys > sys.path = [ '/etc/python2.4', '/home/me/foo', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/var/lib/python-support/python2.4', ] In the machine not working properly, /usr/lib/python2.4/site-packages goes before in the list...joseph
Let's make some precise questions instead: Everybody agrees that if I set the PYTHONPATH to a valid module path, it should load this module first regardless? Everybody agrees that python tries to load modules following the order of sys.path? If the aboce is correct, why python does not insert PYTHONPATH at the beginning of the sys.path (after the eggs)?joseph

7 Answers

6
votes

According to python documentation, this is expected behavior: https://docs.python.org/2.4/lib/module-sys.html:

Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

Under python-2.6 it is different: http://docs.python.org/tutorial/modules.html#the-module-search-path

5
votes

I found the problem (I've missed early on when somebody pointed me to Where is Python's sys.path initialized from?).

It seems that easy_install creates a pth file /usr/lib/python2.4/site-packages/easy-install.pth which is then loaded by site.py. This inserts the site-packages path in the sys path before the PYTHONPATH. Not nice.

4
votes

I don't believe you have any control over where the PYTHONPATH gets inserted into the actual path list. But that's not the only way to modify the path - you can update sys.path yourself, before you try to import the project.

Edit: In your specific case, you can modify the path with

import sys
sys.path.insert(2, '/home/me/dev/project/src')
1
votes

I see '/usr/lib/python2.4/site-packages' in your path prior to '/home/me/dev/project/src', does that matter? What happens when you switch the two?

From the docs:

When PYTHONPATH is not set, or when the file is not found there, the search continues in an installation-dependent default path

So perhaps you didn't find your working copy on your PYTHONPATH as you had thought?

1
votes

Not a direct answer to you question, but you could also use a virtualenv to create a development environment. In that virtualenv you can then install your product in /home/me/dev/project/src as a development package: "python setup.py develop".

This way you don't have to change your PYTHONPATH manually. Just activate the virtualenv if you want to use the development code.

0
votes

I think you set up PYTHONPATH to /home/me/build/project/src since /home/me/dev/project/src does not appear in sys.path, but /home/me/build/project/src does.

0
votes

It sounds like the src directory doesn't have an __init__.py file. It's not a proper package.