如何在python 2.7中更改sys.path中路径的优先级?
我知道我可以使用PYTHONPATH
环境变量,但这是我将得到的:
$ PYTHONPATH=/tmp python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for i in sys.path:
... print i
...
/usr/local/lib/python2.7/dist-packages/pycuda-2014.1-py2.7-linux-x86_64.egg
/usr/local/lib/python2.7/dist-packages/pytest-2.6.2-py2.7.egg
/usr/local/lib/python2.7/dist-packages/pytools-2014.3-py2.7.egg
/usr/local/lib/python2.7/dist-packages/py-1.4.24-py2.7.egg
/usr/lib/python2.7/dist-packages
/tmp
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages/PILcompat
/usr/lib/python2.7/dist-packages/gtk-2.0
/usr/lib/python2.7/dist-packages/ubuntu-sso-client
>>>
在/tmp
和/usr/lib/python2.7/dist-packages
之间添加了{p> /usr/lib/python2.7
。
我的目标是让python首先从/usr/local/lib/python2.7/dist-packages
加载包。
这就是我想要的:
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.version
<module 'numpy.version' from '/usr/local/lib/python2.7/dist-packages/numpy/version.pyc'>
>>>
如果我按python-numpy
安装apt-get install python-numpy
。 Python将尝试从/usr/lib/python2.7
加载而不是我编译的加载。
答案 0 :(得分:6)
如您所知,sys.path
is initialized from:
PYTHONPATH
但遗憾的是,这只是故事的一部分:setuptools
创建了easy-install.pth
个文件,这些文件也修改了sys.path
,最糟糕的是他们 prepend 包,因此完全搞乱了目录的顺序。
特别是(至少在我的系统上),/usr/local/lib/python2.7/dist-packages/easy-install.pth
包含以下内容:
import sys; sys.__plen = len(sys.path)
/usr/lib/python2.7/dist-packages
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
这会导致/usr/lib/python2.7/dist-packages
在PYTHONPATH
之前被预先添加!
您可以做的只是将此文件中的第二行更改为
/usr/local/lib/python2.7/dist-packages
,您将获得所需的优先权。
但请注意,未来的setuptools
调用可能会覆盖或更改此文件!
答案 1 :(得分:2)
我们遇到了几乎完全相同的情况,并希望扩展@kynan的回应,这是现场的。如果您想要克服这样的easy-install.pth
,但无法修改它(比如说您是没有root / admin访问权限的用户),则可以执行以下操作:
设置alternate python installation scheme
创建用户/主页site-packages
pip install <package> --user
创建一个pth来设置sys.__egginsert
以解决系统/分发easy-install.pth
$PYTHONUSERBASE/lib/python2.7/site-packages/fix_easy_install.pth
import sys; sys.__egginsert = len(sys.path);
这会将sys.__egginsert
设置为指向sys.path
的结尾,包括您的用户路径。当恶意系统/ dist easy-install.pth
然后将其项目插入系统路径的末尾时。