PYTHONPATH被忽略
环境:debian 4.0
Python 2.4
我的“项目”安装在:
/usr/lib/python2.4/site-packages/project。
但我想使用我正在开发的版本,而不是安装的那个,安装的版本在:
/home/me/dev/project/src
所以我做了以下操作:
export PYTHONPATH=/home/me/dev/project/src
ipython
import foo # 这个在 src 目录下
foo.__file__
*/usr/lib/python2.4/site-packages/project/foo.py*
而不是:
/home/me/dev/project/src/project/foo.py
这是为什么呢?我尝试检查路径(在上面做了导出之后),我看到的是:
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 个回答
我觉得你无法控制PYTHONPATH被插入到实际路径列表中的位置。不过,这并不是修改路径的唯一方法——你可以在尝试导入项目之前,自己更新sys.path。
补充:在你的具体情况下,你可以通过以下方式修改路径:
import sys
sys.path.insert(2, '/home/me/dev/project/src')
我找到了问题所在(之前有人提醒我去看 Python的sys.path是从哪里初始化的?,我没注意到)。
看起来,easy_install会创建一个名为 /usr/lib/python2.4/site-packages/easy-install.pth 的文件,然后这个文件会被site.py加载。这样一来,site-packages的路径就会在PYTHONPATH之前被插入到sys路径中。这可真不太好。
根据Python的文档,这是预期的行为:https://docs.python.org/2.4/lib/module-sys.html:
注意,脚本所在的目录会被放在因为PYTHONPATH而插入的条目之前。
在Python 2.6中,这个情况就不一样了:http://docs.python.org/tutorial/modules.html#the-module-search-path