2014-10-04 65 views
2

如何更改python 2.7中sys.path中路径的优先级? 我知道,我可以使用PYTHONPATH环境变量,但它是什么,我会得到:更改python sys.path的优先级

$ 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/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'> 
>>> 

如果我通过apt-get install python-numpy安装python-numpy。 Python将尝试从/usr/lib/python2.7加载,而不是我编译的那个。

+0

从你提供的python *的输出是从/ usr/local'加载模块到'/ usr/lib'中的模块之前,那么问题出在哪里? – Bakuriu 2014-10-04 13:32:00

+0

您是否试过简单地编辑变量sys.path来查看它是否有效? – 2014-10-04 13:32:10

+0

@Bakuriu no。我通过“apt-get remove python-numpy”删除已安装的numpy,以获得此结果以询问解决方案。 – wonghang 2014-10-04 13:33:02

回答

6

正如你可能知道,sys.path is initialized from

  • 当前目录
  • 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) 

这将导致/usr/lib/python2.7/dist-packagesPYTHONPATH之前甚至预先考虑!

你可以做的仅仅是在此文件中的第2行改为

/usr/local/lib/python2.7/dist-packages 

,你会得到你想要的优先级。

但是要注意,未来的setuptools调用可能会覆盖或更改此文件!