更改python sys.path的优先级

时间:2014-10-04 13:15:22

标签: 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
>>> 
/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加载而不是我编译的加载。

2 个答案:

答案 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-packagesPYTHONPATH 之前被预先添加!

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

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

,您将获得所需的优先权。

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

答案 1 :(得分:2)

我们遇到了几乎完全相同的情况,并希望扩展@kynan的回应,这是现场的。如果您想要克服这样的easy-install.pth,但无法修改它(比如说您是没有root / admin访问权限的用户),则可以执行以下操作:

  • 设置alternate python installation scheme

    • e.g。我们使用PYTHON HOME安装(设置PYTHONUSERBASE)
  • 创建用户/主页site-packages

    • 您可以通过将软件包安装到用户env: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然后将其项目插入系统路径的末尾时。