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

Lor*_*ein 7 suse python

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

Fah*_*tha 6

(如有错误和遗漏,请更正​​。谢谢。)

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

目前,您有以下可能性,按范围递减顺序排列:

  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.
    
    Run Code Online (Sandbox Code Playgroud)

    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"))
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    /usr/local/lib/python2.6/dist-packages$ cat foo.pth 
    /home/faheem/dummypythonpath
    
    Run Code Online (Sandbox Code Playgroud)

    在另一个终端做

    >>> import sys
    >>> sys.path
        [...,'/home/faheem/dummypythonpath',...,]
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    export PYTHONPATH=$PYTHONPATH:"/home/username/lib/python2.6/dist-packages"
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    import sys
    sys.path.append(some_additional_path)
    
    Run Code Online (Sandbox Code Playgroud)

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

另请参阅 Greg Ward 关于修改 Python 的搜索路径。这对可用的替代方案进行了很好的讨论。