首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改python sys.path的优先级

更改python sys.path的优先级
EN

Stack Overflow用户
提问于 2014-10-04 21:15:22
回答 2查看 10K关注 0票数 4

在Python2.7中,如何更改sys.path中路径的优先级?我知道我可以使用PYTHONPATH环境变量,但这是我将得到的:

代码语言:javascript
运行
复制
$ 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
>>> 

/usr/lib/python2.7/dist-packages/usr/lib/python2.7之间添加了/tmp

我的目标是让python首先从/usr/local/lib/python2.7/dist-packages加载包。

这是我想要的:

代码语言:javascript
运行
复制
$ 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加载,而不是我编译的那个。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-23 06:26:45

如你所知,sys.path is initialized from

依赖于PYTHONPATH

  • an安装的
  • 当前目录

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

特别是(至少在我的系统上),有一个包含以下内容的/usr/local/lib/python2.7/dist-packages/easy-install.pth

代码语言:javascript
运行
复制
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之前!

您可以简单地将此文件中的第二行更改为

代码语言:javascript
运行
复制
/usr/local/lib/python2.7/dist-packages

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

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

票数 9
EN

Stack Overflow用户

发布于 2018-06-01 01:10:36

我们遇到了几乎相同的情况,并希望扩展@kynan的反应,这是一针见血的。如果您有一个想要克服的easy-install.pth,但无法对其进行修改(假设您是一个没有超级用户/管理员访问权限的用户),您可以执行以下操作:

代码语言:javascript
运行
复制
- e.g. we use a PYTHON HOME install (setting PYTHONUSERBASE)

  • 创建用户/主目录site-packages

代码语言:javascript
运行
复制
- You can do this by installing a package into the user env: `pip install <package> --user` 

要解决系统/分发easy-install.pth的问题,请创建

  • 以设置sys.__egginsert

代码语言:javascript
运行
复制
- Create a `$PYTHONUSERBASE/lib/python2.7/site-packages/fix_easy_install.pth`
- Containing: `import sys; sys.__egginsert = len(sys.path);`

这会将sys.__egginsert设置为指向sys.path的末尾,包括用户站点路径。当恶意系统/dist easy-install.pth将其项目插入到系统路径的末尾时。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26193193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档