防止Python加载pth文件

3 投票
2 回答
1268 浏览
提问于 2025-04-20 07:03

我的情况是这样的:

  • 我在本地安装了一个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 个回答

-2

没有办法直接删除 pth 文件。标准的 Python 会在 /usr/lib/usr/local/lib 这两个地方查找 pth 文件。

不过,你可以通过 virtualenv 创建一个独立的 Python 环境。

3

我终于解决了这个问题——我的 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 文件会在之后再被执行一次!

撰写回答