Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 370 – 每个用户的 site-packages 目录

作者:
Christian Heimes <christian at python.org>
状态:
最终版
类型:
标准跟踪
创建日期:
2008年1月11日
Python 版本:
2.6, 3.0
发布历史:


目录

摘要

本 PEP 提出一个新的每个用户的 site-packages 目录,允许用户在其主目录中本地安装 Python 包。

基本原理

当前 Python 版本没有统一的方式将包安装到用户的主目录中(Mac Framework 构建除外)。用户要么被迫请求系统管理员为他们安装或更新包,要么使用许多变通方法之一,例如 Virtual Python [1]、Working Env [2] 或 Virtual Env [3]

本 PEP 的目标不是取代这些工具,也不是实现 Python 的隔离安装。它只实现了最常见的用例,即为每个用户添加一个 site-packages 目录。

该功能无法使用环境变量 PYTHONPATH 实现。该环境变量只是在 sys.path 的开头插入一个新目录,但它不会解析目录中的 pth 文件。某些应用程序和 Python eggs 需要一个完整的 site-packages 路径。

规范

site 目录 (site-packages)

一个在 sys.path 中的目录。与普通目录不同,该目录中的 pth 文件也会被处理。

用户 site 目录

用户主目录内的 site 目录。用户 site 目录是特定于 Python 版本的。路径包含版本号(仅主版本和次版本)。
Unix (包括 Mac OS X)
~/.local/lib/python2.6/site-packages
Windows
%APPDATA%/Python/Python26/site-packages

用户数据目录

通常是用户 site 目录的父目录。它用于 Python 版本特定的数据,如配置文件、文档、图像和翻译。
Unix (包括 Mac)
~/.local/lib/python2.6
Windows
%APPDATA%/Python/Python26

用户基本目录

它位于用户的主目录内。用户 site 目录和用户配置目录都在基本目录内。在某些系统上,该目录可能与第三方应用程序共享。
Unix (包括 Mac)
~/.local
Windows
%APPDATA%/Python

用户脚本目录

一个用于二进制文件和脚本的目录。[10] 它在 Python 版本之间共享,并且是脚本的目标目录。
Unix (包括 Mac)
~/.local/bin
Windows
%APPDATA%/Python/Scripts

Windows 注意事项

在 Windows 上,选择了 Application Data 目录(即 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 的 Framework 构建包括 ~/Library/Python/2.6/site-packages 作为额外的搜索路径。

实施

site 模块获得了一个新方法 adduserpackage(),它将相应的目录添加到搜索路径中。如果 Python 启动时该目录不存在,则不会添加。但是,用户 site 目录和用户基本目录的位置存储在 distutils 的内部变量中。

用户 site 目录在系统 site 目录之前添加,但在 Python 的搜索路径和 PYTHONPATH 之后添加。这种设置允许用户安装与系统管理员不同版本的包,但可以防止用户意外覆盖 stdlib 模块。stdlib 模块仍然可以通过 PYTHONPATH 覆盖。

出于安全原因,当有效用户 ID 或组 ID 不等于进程 uid / gid 时,用户 site 目录不会添加到 sys.path [9]。这是防止代码注入 suid 应用程序的额外障碍。但是,Python suid 脚本必须始终使用 -E 和 -s 选项,否则用户可以偷偷注入自己的代码。

用户 site 目录可以通过新选项 -s 或环境变量 PYTHONNOUSERSITE 禁用。该功能可以通过将 site.ENABLE_USER_SITE 设置为 False 来全局禁用。它必须通过编辑 site.py 来设置。它不能在 sitecustomize.py 或之后更改。

用户基本目录的路径可以通过环境变量 PYTHONUSERBASE 覆盖。当 PYTHONUSERBASE 未设置或为空时,使用默认位置。

distutils.command.install (setup.py install) 获得一个新参数 --user,用于将包安装到用户 site 目录中。所需的目录是按需创建的。

distutils.command.build_ext (setup.py build_ext) 获得一个新参数 --user,它将用户基本目录中的 include/ 和 lib/ 目录添加到头文件和库的搜索路径中。它还将 lib/ 目录添加到 rpath。

site 模块获得两个参数 --user-base--user-site,用于将用户基本目录或用户 site 目录的路径打印到标准输出。该功能旨在用于脚本,例如 ./configure --prefix $(python2.5 -m site --user-base)

distutils.sysconfig 将获得访问 site 私有变量的方法。(尚未实现)

Windows 更新程序也需要更新。它应该创建一个菜单项,在新资源管理器窗口中打开用户 site 目录。

向后兼容性

待定

参考实现

bug 跟踪器中提供了参考实现。[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

最后修改: 2025-02-01 08:55:40 GMT