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

Python 增强提案

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 运算符(及其反义词)的字符串
  • 使用 <<=>=< 运算符的版本号,以及字符串支持的那些运算符

常用的布尔运算符 andor 可用于组合表达式,并且支持括号进行分组。

伪语法为

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 标记变量之一。

VEREXPRPEP 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_versionimplementation_version 标记变量分别来自 sys.version_infosys.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