【问题标题】:Should Python 2.6 on OS X deal with multiple easy-install.pth files in $PYTHONPATH?OS X 上的 Python 2.6 是否应该处理 $PYTHONPATH 中的多个 easy-install.pth 文件?
【发布时间】:2010-05-08 12:50:19
【问题描述】:

我正在从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) 但不是第二个,所以鸡蛋安装在 $HOME /lib/python 未添加到路径中。在阅读现成的 site.py 时,我一生都无法理解它为什么会这样做。

有人可以启发我吗?或者建议如何让 Python 读取这两个 easy-install.pth 文件?

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

【问题讨论】:

    标签: python lxml easy-install


    【解决方案1】:

    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 发行版还没有。

    【讨论】:

      猜你喜欢
      • 2018-07-30
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多