更改python sys.path的优先级

won*_*ang 2 python python-2.7

如何在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
>>> 
Run Code Online (Sandbox Code Playgroud)

/tmp/usr/lib/python2.7/dist-packages和之间添加/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'>
>>> 
Run Code Online (Sandbox Code Playgroud)

如果我安装python-numpyapt-get install python-numpy.Python将尝试加载/usr/lib/python2.7而不是我编译的加载.

kyn*_*nan 7

如您所知,sys.path初始化自:

  • 当前目录
  • 您的 PYTHONPATH
  • 依赖于安装的默认值

然而不幸的是,这只是故事的一部分:setuptools创建easy-install.pth文件,它们也会修改sys.path,最糟糕的是它们会预先包装,因此完全搞乱了目录的顺序.

特别是(至少在我的系统上),有/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)
Run Code Online (Sandbox Code Playgroud)

这将导致/usr/lib/python2.7/dist-packages前置甚至你面前PYTHONPATH!

您可以做的只是将此文件中的第二行更改为

/usr/local/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

你会得到你想要的优先权.

但请注意,此文件可能会被以后的setuptools调用覆盖或再次更改!