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 生成的安装程序)安装包的位置。将本地开发的代码包含在与已安装的可执行文件相同的目录中并非良好实践。
显然,用户可以通过本地修改的 site.py、合适的 sitecustomize.py,甚至通过 .pth 文件来操作 sys.path。然而,应该有一个标准的文件位置,而不是依赖于每个独立的站点都必须设置自己的策略。
此外,随着 distutils 作为模块分发方式变得越来越普遍,对分发模块的标准安装位置的需求也将变得更加普遍。最好现在就定义这样一个标准,而不是等到以后有更多基于 distutils 的包需要重建时再定义。
值得注意的是,在 Python 2.1 之前,Macintosh 平台的 sys.path 中不包含 site-packages 目录。这在 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 上没有这样的通用位置,因此也没有必要拥有两个独立的包目录。 - 如果用户希望将 DLLs 保存在 Windows 上的单个位置,而不是将它们保存在包目录中,那么 Python 安装目录的 DLLs 子目录已经可用于此目的。添加一个专门用于 DLLs 的额外目录应该不是必需的。
未解决的问题
- 来自 Unix 用户的评论表明,Unix 平台上的当前设置可能存在问题。本 PEP 没有涉及跨平台问题,而是明确地将自身限制在 Windows 平台,将其他平台的更改留给其他 PEP 讨论。
- 嵌入 Python 的应用程序可能存在问题。据作者所知,此更改不会造成任何问题。目前还没有嵌入 Python 的用户发表评论(支持或反对)。
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0250.rst
最后修改: 2025-02-01 08:55:40 GMT