我在 SUSE 机器上,默认 Python 站点包位置是/usr/lib64/python2.6/site-packages. 有些软件包会自动安装/usr/lib/python2.6/site-packages。如何配置 Python 以便它也可以查看/usr/lib64/python2.6/site-packages?
(如有错误和遗漏,请更正。谢谢。)
首先,一个问题和一个评论。我不使用 SUSE,所以请加一点盐。/usr/lib/python2.6/site-packages 中安装的包是官方包吗?如果是这样,则 SUSE 已损坏,因此不太可能。如果它们不是官方软件包,您可以要求打包人员使用标准路径,或者,您可以向 SUSE 提交一个愿望清单错误,要求他们支持此附加路径。这将为您和其他人节省额外的麻烦。
目前,您有以下可能性,按范围递减顺序排列:
更改所有用户的模块搜索路径(方法一)
更改 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 包时将其合并。
更改所有用户的模块搜索路径(方法二)
将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)更改所有用户的模块搜索路径(方法三)
环境变量 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 中的路径添加到预先存在的路径中的位置似乎并未由
实现规定。
更改每个用户的模块搜索路径。
通常的方法是在用户的 bashrc 中更改 PYTHONPATH,即~/.bashrc. 再次检查它是否来自登录和交互式 shell。
在每个脚本的基础上更改模块搜索路径。这是通过附加到 sys.path 来完成的,即
import sys
sys.path.append(some_additional_path)
Run Code Online (Sandbox Code Playgroud)
这仅适用于导入它的脚本。据我所知,这通常用于临时使用,在非标准位置导入模块时,例如从主目录中的某个位置。
另请参阅 Greg Ward 关于修改 Python 的搜索路径。这对可用的替代方案进行了很好的讨论。
| 归档时间: |
|
| 查看次数: |
14652 次 |
| 最近记录: |