配置 Python 在查找包时包含另一个目录

配置 Python 在查找包时包含另一个目录

我在一台 SUSE 机器上,默认的 Python 站点包位置是/usr/lib64/python2.6/site-packages。有些软件包会自动安装/usr/lib/python2.6/site-packages。如何配置 Python 以便它也查找/usr/lib64/python2.6/site-packages

答案1

(请根据需要纠正错误和遗漏。谢谢。)

首先是一个问题和评论。我不使用 SUSE,所以对此持怀疑态度。 /usr/lib/python2.6/site-packages 中安装的软件包是官方软件包吗?如果是这样,则 SUSE 已损坏,因此这种情况不太可能发生。如果它们不是官方软件包,您可以要求打包者使用标准路径,或者您可以向 SUSE 提交愿望清单错误,要求他们支持此附加路径。这将为您和其他人省去额外的麻烦。

目前,您有以下可能性(按范围递减的顺序):

  1. 更改所有用户的模块搜索路径(方法1)

    更改 Python 安装中的模块搜索路径。

    默认模块搜索路径硬连线到二进制文件中。可以在运行时配置附加路径​​,例如在 site.py 文件中。例如,Debian 使用 /usr/lib/python2.6/site.py (对于默认的 python 2.6 安装)来进行特定于站点的配置。文件顶部写着

    Append module search paths for third-party packages to `sys.path`.
    
    ****************************************************************
    * This module is automatically imported during initialization. *
    ****************************************************************
    [...]
    
    This will append site-specific paths to the module search path.
    

    Debian 补丁 debian/patches/site-locations.diff

    对于 Debian 及其衍生版本,此 sys.path 增加了发行版中分发的软件包的目录。本地插件安装在 /usr/local/lib/python/dist-packages 中,Debian 插件安装在 /usr/{lib,share}/python/dist-packages 中。不使用 /usr/lib/python/site-packages。

    有问题的补丁是

                    sitedirs.append(os.path.join(prefix,
    "Lib", "site-packages"))
                 elif os.sep == '/':
        +            sitedirs.append(os.path.join(prefix,
    "local/lib",
        +                                        "python" + sys.version[:3],
        +                                        "dist-packages"))
                     sitedirs.append(os.path.join(prefix,
    "lib",
                                                 "python" + sys.version[:3],
        -                                        "site-packages"))
        -            sitedirs.append(os.path.join(prefix,
    "lib", "site-python"))
        +                                        "dist-packages"))
        +            sitedirs.append(os.path.join(prefix,
    "lib", "dist-python"))
                 else:
                     sitedirs.append(prefix)
                     sitedirs.append(os.path.join(prefix,
    "lib", "site-packages"))
    

    因此,您可以修改系统包中的 site.path 以生成修改后的模块搜索路径。不过,您可能不想这样做。一方面,您必须将其合并到发行版的 python 包的每次更新中。

  2. 更改所有用户的模块搜索路径(方法2)

    将 some.pth 形式的文件添加到搜索路径中已有的目录中,该目录包含相对或绝对路径。例如。

    /usr/local/lib/python2.6/dist-packages$ cat foo.pth 
    /home/faheem/dummypythonpath
    

    在另一个终端做

    >>> import sys
    >>> sys.path
        [...,'/home/faheem/dummypythonpath',...,]
    
  3. 更改所有用户的模块搜索路径(方法3)

    环境变量 PYTHONPATH 通常用于附加到用户级别的系统路径。您可以将其放入所有用户都可以获取的文件中。例如。在 Debian 中,我们有 /etc/bash.bashrc,它位于顶部

    # System-wide .bashrc file for interactive bash(1) shells.
    
    # To enable the settings / commands in this file for login shells as well,
    # this file has to be sourced in /etc/profile.
    

    所以你可以在那里添加 或 PYTHONPATH 。您可能希望它同时用于登录和交互式 shell,因此您需要对此进行检查。不幸的是,发行版在实现这一点方面往往很不稳定。

    PYTHONPATH 中的路径被添加到系统中的默认搜索路径列表中(例如可以通过 sys.path 获取 - 见下文)。考虑到 PYTHONPATH 已设置的可能性,只需向其中添加所需的其他目录,例如。

    export PYTHONPATH=$PYTHONPATH:"/home/username/lib/python2.6/dist-packages"
    

    如果您获取 PYTHONPATH 变量,然后再次检查 sys.path,您将
    看到路径已添加。请注意,PYTHONPATH 中的路径添加到预先存在的路径的位置
    似乎并未由
    实现指定。

  4. 更改每个用户的模块搜索路径。

    通常的方法是更改​​用户的 bashrc 中的 PYTHONPATH,即~/.bashrc.再次检查它是否来自登录 shell 和交互式 shell。

  5. 基于每个脚本更改模块搜索路径。这是通过附加到 sys.path 来完成的,即

    import sys
    sys.path.append(some_additional_path)
    

    这仅适用于导入它的脚本。据我所知,这通常用于临时使用,在非标准位置(例如从主目录中的某个位置)导入模块时。

另请参阅格雷格·沃德 (Greg Ward)修改Python的搜索路径。这对可用的替代方案进行了很好的讨论。

答案2

使用sys.path:

import sys
sys.path.append("/home/me/mypy")

您还可以检查site模块文档,解释了如何计算特定于站点的路径。

相关内容