PEP 496 – 环境标记
- 作者:
- James Polley <jp at jamezpolley.com>
- BDFL 代表:
- Alyssa Coghlan <ncoghlan at gmail.com>
- 状态:
- 已拒绝
- 类型:
- 信息性
- 主题:
- 打包
- 创建:
- 2015 年 7 月 3 日
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')
以下是在使用 Windows 时,在 setup.py 中包含的一些条件元数据示例,该示例要求在运行时和构建时都使用 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'
)或下面列出的 Strings
标记变量之一。
VEREXPR
是 PEP 440 版本标识符,或下面列出的 Version number
标记变量之一。版本号之间的比较使用 PEP 440 语义进行。
字符串
os_name
:os.name
sys_platform
:sys.platform
platform_release
:platform.release()
implementation_name
:sys.implementation.name
platform_machine
:platform.machine()
platform_python_implementation
:platform.python_implementation()
如果特定字符串值不可用(例如,在 3.3 之前的 Python 版本中,sys.implementation.name
),则相应的标记变量**必须**被视为等效于空字符串。
如果特定版本号值不可用(例如,在 3.3 之前的 Python 版本中,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
上次修改时间: 2023-10-11 12:05:51 GMT