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
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) - NoName 2009-06-16 16:21
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
For the sake of solving this, let's assume I want to be able to run it with ipython - NoName 2009-06-16 16:01
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.
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')
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?
My PYTHONPATH is correct - NoName 2009-06-16 15:03
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.
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.
In the machine not working properly, /usr/lib/python2.4/site-packages goes before in the list.. - NoName 2009-06-16 15:02