Skip to main content
 首页 » 编程设计

python之OS X 上的 Python 2.6 是否应该处理 $PYTHONPATH 中的多个 easy-install.pth 文件

2025年05月04日6zlslch

我正在从 sage 运行 ipython并且还使用了一些不在 sage 中的包(lxml、argparse),这些包安装在我的主目录中。因此,我最终得到了

的 $PYTHONPATH

$HOME/sage/local/lib/python:$HOME/lib/python

Python 正在读取并处理它找到的第一个 easy-install.pth ($HOME/sage/local/lib/python/site-packages/easy-install.pth) 但不是第二个,所以 eggs 安装在 $HOME/lib/python 未添加到路径中。在阅读现成的 site.py 时,我终究无法理解为什么要这样做。

谁能教教我?或者建议如何让 Python 读取两个 easy-install.pth 文件?

将两者合并到一个 .pth 文件中是目前可行的解决方法,因此这个问题主要是出于好奇。

请您参考如下方法:

TL;DR: 调用 site.addsitedir 来处理 .pth 文件


我不确定 OS X,但 PYTHONPATH 和站点包实际上在增加 sys.path 方面是独立的。

Try this: 
    set PYTHONPATH somehow (OS dependent) 
    python -c "import sys; print '\n'.join(sys.path); print sys.exec_prefix; print sys.prefix" 
    python -S -c "import sys; print '\n'.join(sys.path);print sys.exec_prefix; print sys.prefix" 

在我的 linux 机器上,PYTHONPATH 两次都是输出的一部分 - 即使第二次运行中的 -S 开关跳过了导入站点模块。

现在,site.module 所做的实际上是采用 (sys.exec_prefix, sys.prefix) 和操作系统相关前缀的组合(对于 linux:lib/python2.7/dist-packages),检查是否有任何组合是现有目录,如果是,则对其进行处理(包括解析 .pth 文件)

代码在 site.py 模块中 - getsitepackages()。

def getsitepackages(): 
    """Returns a list containing all global site-packages directories 
    (and possibly site-python). 
 
    For each directory present in the global ``PREFIXES``, this function 
    will find its `site-packages` subdirectory depending on the system 
    environment, and will return a list of full paths. 
    """ 
    sitepackages = [] 
    seen = set() 
 
    for prefix in PREFIXES: 
        if not prefix or prefix in seen: 
            continue 
        seen.add(prefix) 
 
        if sys.platform in ('os2emx', 'riscos'): 
            sitepackages.append(os.path.join(prefix, "Lib", "site-packages")) 
        elif os.sep == '/': 
            sitepackages.append(os.path.join(prefix, "lib", 
                                        "python" + sys.version[:3], 
                                        "site-packages")) 
            sitepackages.append(os.path.join(prefix, "lib", "site-python")) 
        else: 
            sitepackages.append(prefix) 
            sitepackages.append(os.path.join(prefix, "lib", "site-packages")) 
        (...) 

此函数最终返回一个列表,并为该列表的每个元素调用 addsitedir 函数 - 在该函数中,您具有使 .pth 文件正常工作的逻辑。

长话短说 - 要处理 .pth 文件 - 在您的入门级脚本中调用 site.addistedir。您也可以考虑将它放在您的 sitecustomize.py 中——只要确保您的 python 发行版还没有。