Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

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