![配置 Python 在查找包时包含另一个目录](https://linux22.com/image/16591/%E9%85%8D%E7%BD%AE%20Python%20%E5%9C%A8%E6%9F%A5%E6%89%BE%E5%8C%85%E6%97%B6%E5%8C%85%E5%90%AB%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95.png)
我在一台 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)
更改 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)
将 some.pth 形式的文件添加到搜索路径中已有的目录中,该目录包含相对或绝对路径。例如。
/usr/local/lib/python2.6/dist-packages$ cat foo.pth /home/faheem/dummypythonpath
在另一个终端做
>>> import sys >>> sys.path [...,'/home/faheem/dummypythonpath',...,]
更改所有用户的模块搜索路径(方法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 中的路径添加到预先存在的路径的位置
似乎并未由
实现指定。更改每个用户的模块搜索路径。
通常的方法是更改用户的 bashrc 中的 PYTHONPATH,即
~/.bashrc
.再次检查它是否来自登录 shell 和交互式 shell。基于每个脚本更改模块搜索路径。这是通过附加到 sys.path 来完成的,即
import sys sys.path.append(some_additional_path)
这仅适用于导入它的脚本。据我所知,这通常用于临时使用,在非标准位置(例如从主目录中的某个位置)导入模块时。
另请参阅格雷格·沃德 (Greg Ward)修改Python的搜索路径。这对可用的替代方案进行了很好的讨论。