PEP 496 – 环境标记
- 作者:
- James Polley <jp at jamezpolley.com>
- BDFL 委托:
- Alyssa Coghlan <ncoghlan at gmail.com>
- 状态:
- 已拒绝
- 类型:
- 信息性
- 主题:
- 打包
- 创建日期:
- 2015年07月03日
PEP 状态
在最初起草此 PEP 后,PEP 508 被开发并提交,用于完全指定依赖项声明语法,包括环境标记。因此,此 PEP 被否决,转而采用更全面的PEP 508。
摘要
环境标记描述了当前执行环境的条件。它们用于指示何时仅在特定环境中需要某些依赖项,以及指示对具有超出 Python 运行时可用性之外的其他约束的分发包的支持平台。
环境标记最早是在PEP 345 中指定的。 PEP 426(将取代PEP 345)提出了对标记的扩展。当 2.7.10 发布时,即使这些扩展也因其依赖于简单的词法比较而变得不足,因此此 PEP 应运而生。
基本原理
许多 Python 包都是为了可移植性而编写的。
对于许多包来说,这意味着它们旨在支持广泛的 Python 版本。如果它们依赖于诸如 argparse 等库(最初是外部库,后来被纳入核心),则指定一组单一的要求是困难的,因为所需包的集合取决于正在使用的 Python 版本。
对于其他包来说,设计可移植性意味着支持多种操作系统。然而,它们之间显著的差异可能意味着特定依赖项仅在特定平台需要(例如,仅在 Windows 上依赖 pywin32)”
环境标记试图通过允许开发人员列出特定于特定环境的要求来为要求列表提供更大的灵活性。
示例
以下是一些 requirements.txt 中此类标记的示例
pywin32 >=1.0 ; sys_platform == 'win32'
unittest2 >=2.0,<3.0 ; python_version == '2.4' or python_version == '2.5'
backports.ssl_match_hostname >= 3.4 ; python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')
以下是一个 setup.py 中包含的条件元数据的示例,用于在 Windows 上使用时,在运行时和构建时都需要 PyWin32 的分发包
setup(
install_requires=["pywin32 > 1.0 : sys.platform == 'win32'"],
setup_requires=["pywin32 > 1.0 : sys.platform == 'win32'"]
)
微语言
这背后的微语言如下。它比较
- 使用
==和in运算符(及其反义词)的字符串 - 除了支持字符串的运算符外,还使用
<、<=、>=和<运算符的版本号
通常的布尔运算符 and 和 or 可用于组合表达式,并支持括号进行分组。
伪语法是
MARKER: EXPR [(and|or) EXPR]*
EXPR: ("(" MARKER ")") | (STREXPR|VEREXPR)
STREXPR: STRING [STRCMPOP STREXPR]
STRCMPOP: ==|!=|in|not in
VEREXPR: VERSION [VERCMPOP VEREXPR]
VERCMPOP: (==|!=|<|>|<=|>=)
SUBEXPR 是 Python 字符串(例如 'win32')或下面列出的 字符串 标记变量之一。
VEREXPR 是 PEP 440 版本标识符,或下面列出的 版本号 标记变量之一。版本号之间的比较是使用 PEP 440 语义进行的。
字符串
os_name:os.namesys_platform:sys.platformplatform_release:platform.release()implementation_name:sys.implementation.nameplatform_machine:platform.machine()platform_python_implementation:platform.python_implementation()
如果某个字符串值不可用(例如 Python 3.3 之前的版本中的 sys.implementation.name),则相应的标记变量必须被视为等同于空字符串。
如果某个版本号值不可用(例如 Python 3.3 之前的版本中的 sys.implementation.version),则相应的标记变量必须被视为等同于 0
版本号
python_version:platform.python_version()[:3]python_full_version: 见下文定义platform_version:platform.version()implementation_version: 见下文定义
根据以下算法,python_full_version 和 implementation_version 标记变量分别派生自 sys.version_info 和 sys.implementation.version
def format_full_version(info):
version = '{0.major}.{0.minor}.{0.micro}'.format(info)
kind = info.releaselevel
if kind != 'final':
version += kind[0] + str(info.serial)
return version
python_full_version = format_full_version(sys.version_info)
implementation_version = format_full_version(sys.implementation.version)
python_full_version 通常对应于 sys.version.split()[0]。
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0496.rst
最后修改: 2025-02-01 08:59:27 GMT