防止Python加载pth文件
我的情况是这样的:
- 我在本地安装了一个Python版本。还有一个全局的Python版本,但安装得很糟糕,我不想使用它。(我没有管理员权限)。
- 在
/usr/local/lib/site-packages
目录下,有一个x.pth
文件,里面包含了一个指向错误安装的numpy的路径。 - 我的PYTHONPATH里没有这些路径。不过,有个管理员生成的脚本把
/usr/local
和/usr/local/bin
加入了我的PATH(这是我的猜测,并不是确定的事实)。 - 这 somehow 导致错误的numpy路径被添加到了我的
sys.path
中。当我运行python -S
时,它并不在那儿。 site.PREFIXES
不包括/usr/local
。我不知道为什么之前提到的pth文件会被加载。- 我尝试在本地安装的site-packages目录下添加一个自己的pth文件,执行
import sys; sys.path.remove('pth/to/faulty/numpy')
,但失败了,因为当那个pth文件被加载时,错误的路径还没有在sys.path里。
有没有办法让我禁用这个pth文件的加载,或者在Python加载之前从sys.path中移除这个路径?
我尝试过设置虚拟环境,但不适合我目前的情况。
2 个回答
没有办法直接删除 pth 文件。标准的 Python 会在 /usr/lib
和 /usr/local/lib
这两个地方查找 pth 文件。
不过,你可以通过 virtualenv 创建一个独立的 Python 环境。
我终于解决了这个问题——我的 site-packages 库里有一个 easy_install.pth
文件,里面包含了有问题的 numpy,奇怪的是,它并不是在 /usr/local/lib/site-packages
上的 x.pth 文件。
经过这么长时间的折腾,我想分享一些我学到的东西,希望能帮助到其他遇到类似问题的人:
如果你本地安装了 Python,它默认不会在 '/usr/local/lib' 这个地方查找。如果你想知道它查找的路径,可以运行:
import site print site.PREFIXES
Python 会在这里查找路径 +
lib/python2.X/site-packages
。具体可以在 这里找到说明。根据这些文档,你其实可以对你的 sys.path 进行一些调整。如果你把
usercustomize
模块添加到你的本地 site-packages 里(可以用import site; site.getusersitepackages()
来找到),它会被执行。不过,这个我花了一些时间才明白——它是在 Python 处理完 site-packages 里的pth
文件之后,再处理一次之前的文件。如果我在处理这个的函数里加一个打印语句(lib/site.py 的 addsitedir),它会打印出:/home/user/.local/lib/python2.7/site-packages /home/user/py/lib/python2.7/site-packages #This is where your code runs /home/user/py/lib/python2.7/site-packages/numpy-1.9.0-py2.7-linux-x86_64.egg /home/user/Develop/Python/myproject /home/user/lmfit-0.7.2 /home/user/py/lib/python2.7/site-packages #NOTE: this runs a second time
一旦我在 site-packages 里漏掉了一个 pth 文件,我就无法通过
usercustomize
来修复它,因为那个 pth 文件会在之后再被执行一次!