2014-10-04 63 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調用可能會覆蓋或更改此文件!