PEP 250 – 在 Windows 上使用 site-packages
- 作者:
- Paul Moore <p.f.moore at gmail.com>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2001年3月30日
- Python 版本:
- 2.2
- 历史记录:
- 2001年3月30日
摘要
标准 Python 发行版包含一个名为 Lib/site-packages
的目录,它在 Unix 平台上用于保存本地安装的模块和包。与 Python 一起分发的 site.py
模块包含对在 site-packages 目录中查找其他模块的支持。
本 PEP 提出在 Windows 平台上以类似的方式使用 site-packages 目录。
动机
在 Windows 平台上,sys.path
的默认设置不包含适合用户安装本地开发模块的目录。“预期”位置似乎是包含 Python 可执行文件本身的目录。这也是 distutils(以及 distutils 生成的安装程序)安装包的位置。将本地开发的代码与已安装的可执行文件放在同一目录中不是好的做法。
显然,用户可以操作 sys.path
,无论是在本地修改的 site.py
中,还是在合适的 sitecustomize.py
中,甚至通过 .pth
文件。但是,应该有一个标准位置用于此类文件,而不是依赖于每个站点都必须设置自己的策略。
此外,随着 distutils 作为分发模块的一种方式变得越来越普遍,对分发模块的标准安装位置的需求将变得越来越普遍。最好现在定义这样一个标准,而不是等到更多基于 distutils 的包存在时才需要重新构建。
值得注意的是,在 Python 2.1 之前,site-packages 目录未包含在 Macintosh 平台的 sys.path
中。这已在 2.1 中更改,并且 Macintosh 现在包含 sys.path
,使得 Windows 成为唯一一个没有特定于站点的模块目录的主要平台。
实现
此功能的实现非常简单。只需更改 site.py
,以更改设置 sitedirs 的部分即可。Python 2.1 版本有
if os.sep == '/':
sitedirs = [makepath(prefix,
"lib",
"python" + sys.version[:3],
"site-packages"),
makepath(prefix, "lib", "site-python")]
elif os.sep == ':':
sitedirs = [makepath(prefix, "lib", "site-packages")]
else:
sitedirs = [prefix]
一个合适的更改是简单地用以下内容替换最后 4 行:
else:
sitedirs == [prefix, makepath(prefix, "lib", "site-packages")]
还需要对 distutils 进行更改,以反映此策略更改。Sourceforge 上有一个补丁,补丁 ID 为 445744,实现了此更改。请注意,该补丁检查 Python 版本,并且仅对 Python 2.2 及更高版本调用新行为。这是为了确保 distutils 与早期版本的 Python 保持兼容。
最后,实现 bdist_wininst
命令使用的 Windows 安装程序的可执行代码需要更改为使用新位置。为此提供了一个单独的补丁,目前由 Thomas Heller 维护。
备注
- 此更改不会阻止包使用当前位置——更改仅向
sys.path
添加一个目录,它不会删除任何内容。 - 当前位置 (
sys.prefix
) 和新目录 (site-packages) 都包含在 sitedirs 中,以便在任一位置都识别.pth
文件。 - 此提案向 sitedirs 添加了一个额外的 site-packages 目录。在 Unix 平台上,添加了两个目录,一个用于版本无关的文件(Python 代码),另一个用于版本相关的代码(C 扩展)。这在 Unix 上是必要的,因为 sitedirs 包含一个公共的(跨 Python 版本)包位置,默认情况下在
/usr/local
中。由于 Windows 上没有这样的公共位置,因此也没有必要有两个单独的包目录。 - 如果用户希望将 DLL 保存在 Windows 上的单个位置,而不是将它们保存在包目录中,则 Python 安装目录的 DLLs 子目录已为此目的提供。添加一个仅用于 DLL 的额外目录应该是不必要的。
未解决的问题
- 来自 Unix 用户的评论表明,Unix 平台上的当前设置可能存在问题。为了避免参与跨平台问题,本 PEP 特别限制在 Windows 平台上,并将其他平台的更改留给其他 PEP 来涵盖。
- 嵌入 Python 的应用程序可能会出现问题。据作者所知,此更改应该不会出现任何问题。还没有收到来自嵌入 Python 的用户的评论(支持或反对)。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0250.rst