joseph
joseph

Reputation:

PYTHONPATH ignored

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

Upvotes: 13

Views: 25979

Answers (7)

Mark van Lent
Mark van Lent

Reputation: 13001

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.

Upvotes: 1

van
van

Reputation: 77012

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

Upvotes: 7

joseph
joseph

Reputation:

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.

Upvotes: 5

Mark Ransom
Mark Ransom

Reputation: 308402

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

Upvotes: 4

S.Lott
S.Lott

Reputation: 391952

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

Upvotes: 0

user447688
user447688

Reputation:

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?

Upvotes: 1

David Cournapeau
David Cournapeau

Reputation: 80770

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.

Upvotes: 0

Related Questions