PEP 370 – 每用户 site-packages 目录
- 作者:
- Christian Heimes <christian at python.org>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2008年1月11日
- Python 版本:
- 2.6, 3.0
- 历史记录:
摘要
本 PEP 提出一个新的每用户 site-packages 目录,允许用户在其主目录中本地安装 Python 包。
理由
当前的 Python 版本没有统一的方法将包安装到用户的 home 目录中(Mac Framework 版本除外)。用户要么被迫请求系统管理员为他们安装或更新包,要么使用许多解决方法之一,例如 Virtual Python [1]、Working Env [2] 或 Virtual Env [3]。
PEP 的目标不是替换这些工具或实现 Python 的隔离安装。它只实现了每个用户附加 site-packages 目录的最常见用例。
此功能无法使用环境变量 PYTHONPATH 实现。env 变量只是将一个新目录插入到 sys.path 的开头,但它不会解析目录中的 pth 文件。许多应用程序和 Python egg 需要完整的 site-packages 路径。
规范
站点目录 (site-packages)
位于sys.path
中的目录。与普通目录不同,还会处理目录中的 pth 文件。
用户站点目录
用户主目录内的站点目录。用户站点目录特定于 Python 版本。路径包含版本号(仅主版本和次版本)。
- Unix(包括 Mac OS X)
~/.local/lib/python2.6/site-packages
- Windows
%APPDATA%/Python/Python26/site-packages
用户数据目录
通常是用户站点目录的父目录。它用于 Python 版本特定的数据,例如配置文件、文档、图像和翻译。
- Unix(包括 Mac)
~/.local/lib/python2.6
- Windows
%APPDATA%/Python/Python26
用户基础目录
它位于用户的主目录内。用户站点和用户配置文件目录位于基础目录内。在某些系统上,该目录可能与第三方应用程序共享。
- Unix(包括 Mac)
~/.local
- Windows
%APPDATA%/Python
用户脚本目录
用于二进制文件和脚本的目录。[10] 它在 Python 版本之间共享,并且是脚本的目标目录。
- Unix(包括 Mac)
~/.local/bin
- Windows
%APPDATA%/Python/Scripts
Windows 说明
在 Windows 上,选择 应用程序数据 目录(也称为 APPDATA
),因为它是最指定的应用程序数据位置。Microsoft 建议软件不要写入 USERPROFILE
[5],并且 My Documents
也不适合应用程序数据。[8] 代码不会查询 Win32 API,而是使用环境变量 %APPDATA%。
应用程序数据目录是漫游配置文件的一部分。在具有域登录的网络中,应用程序数据可能会从中央服务器复制到中央服务器,反之亦然。这可能会减慢登录和注销速度。用户可以通过例如将 PYTHONUSERBASE 设置为“%HOMEDRIVE%%HOMEPATH%Applicata Data”的值来保留服务器上的数据。用户应咨询其本地管理员以获取更多信息。[13]
Unix 说明
在 Unix 上,选择 ~/.local
而不是 ~/.python
,因为该目录已经与 /usr/local
相似地被其他几个程序使用。[7] [11]
Mac OS X 说明
在 Mac OS X 上,Python 也使用 ~/.local 目录。[12] Python 的框架版本包括 ~/Library/Python/2.6/site-packages
作为额外的搜索路径。
实现
site 模块获得了一个新方法 adduserpackage()
,该方法将适当的目录添加到搜索路径。如果 Python 启动时目录不存在,则不会添加该目录。但是,用户站点目录和用户基础目录的位置存储在 distutils 的内部变量中。
用户站点目录添加到系统站点目录之前,但位于 Python 的搜索路径和 PYTHONPATH
之后。此设置允许用户安装与系统管理员不同的版本的包,但可以防止用户意外覆盖 stdlib 模块。仍然可以使用 PYTHONPATH
覆盖 stdlib 模块。
出于安全原因,当有效用户 ID 或组 ID 不等于进程 UID/GID 时,不会将用户站点目录添加到 sys.path
[9]。这是防止将代码注入到 suid 应用程序的额外屏障。但是,Python suid 脚本必须始终使用 -E 和 -s 选项,否则用户可以偷偷地插入自己的代码。
可以使用新的选项 -s
或环境变量 PYTHONNOUSERSITE
抑制用户站点目录。可以通过将 site.ENABLE_USER_SITE
设置为 False
来全局禁用此功能。必须通过编辑 site.py
来设置它。它不能在 sitecustomize.py
或之后更改。
可以使用环境变量 PYTHONUSERBASE
覆盖用户基础目录的路径。当未设置或为空时,使用默认位置 PYTHONUSERBASE
。
distutils.command.install
(setup.py install) 获取一个新的参数 --user
,以便将包安装到用户站点目录中。根据需要创建所需的目录。
distutils.command.build_ext
(setup.py build_ext) 获取一个新的参数 --user
,该参数将用户基础目录中的 include/ 和 lib/ 目录添加到头文件和库的搜索路径中。它还将 lib/ 目录添加到 rpath 中。
site 模块获取两个参数 --user-base
和 --user-site
,以将用户基础或用户站点目录的路径打印到标准输出。此功能旨在用于脚本编写,例如 ./configure --prefix $(python2.5 -m site --user-base)
distutils.sysconfig
将获得访问 site 的私有变量的方法。(尚未实现)
Windows 更新程序也需要更新。它应该创建一个菜单项,在新的资源管理器窗口中打开用户站点目录。
向后兼容性
待定
参考实现
参考实现可在错误跟踪器中找到。[4]
版权
本文档已置于公共领域。
参考文献
[6] 每用户 site-packages 目录的初始建议 https://mail.python.org/archives/list/python-dev@python.org/message/V23CUKRH3VCHFLV33ADMHJSM53STPA7I/
来源:https://github.com/python/peps/blob/main/peps/pep-0370.rst
上次修改时间:2023-09-09 17:39:29 GMT