跳转到主要内容

这是一个元包,提供了支持给定Python版本和平台的最早版本的NumPy。如果该平台在PyPI上只有更新版本的NumPy的预构建轮子,则指定该NumPy版本。

项目描述

PyPI

关于

这是一个元包,可以在 pyproject.toml 文件中使用,以自动提供作为构建时间依赖项的给定Python版本和平台的最早版本的NumPy。如果NumPy有预构建轮子的平台,提供的版本也有预构建的NumPy轮子。

使用可用的最早版本的NumPy作为构建时间依赖项的原因是ABI兼容性。使用旧版本的NumPy编译的二进制文件与较新版本的NumPy二进制文件是二进制兼容的,反之则不兼容。这个元包的存在是为了使处理这个更方便,无需在所有需要它的包中手动重复相同的列表。

换句话说

[build-system]
requires = [
    "wheel",
    "setuptools",
    "numpy==1.13.3; python_version=='3.5'",
    "numpy==1.13.3; python_version=='3.6'",
    "numpy==1.14.5; python_version=='3.7'",
    # more numpy requirements...
]

可以替换为

[build-system]
requires = ["wheel", "setuptools", "oldest-supported-numpy"]

随着新Python版本的发布,pyproject.toml 文件无需更新。

问答

为什么在这个存储库中定义NumPy的绑定使用install_requires

NumPy 版本锁定是在 setup.cfg 文件中定义的 install_requires 依赖项中,而不是在 pyproject.toml 文件中的构建时依赖项。这是故意的,因为实际上并不需要 NumPy 来构建 oldest-supported-numpy 的 wheel。我们需要确保当 oldest-supported-numpy 被安装到使用它的软件包的构建环境中时,NumPy 也会作为构建环境中的 运行时 依赖项安装。

另一种思考方式是,由于我们只发布 oldest-supported-numpy 的(通用)wheel,该 wheel 不包含 pyproject.tomlsetup.cfgsetup.py 代码,它只包含元数据,包括当安装 oldest-supported-numpy 时由 pip 安装的依赖项。

如果我的包需要 NumPy 的最新版本,我能使用这个方法吗?

在许多情况下,即使您的包可能需要比这里锁定的版本更新的 NumPy 版本,这通常是一个运行时要求,即用于运行(而不是构建)您的包。在许多情况下,除非您使用 NumPy C API 的最新功能,否则您仍然可以使用较旧版本的 NumPy 来构建您的包,因此您仍然可以使用 oldest-supported-numpy。您仍然可以在 install_requires 中强制实施更新的 NumPy 要求。

如果影响我的 NumPy 的错误只在新版本中修复怎么办?

如果 oldest-supported-numpy 锁定的 numpy 版本对于使用特定 OS/平台/解释器组合的所有用户都是损坏的,我们可以将 == 锁定更新到新版本。一般来说,针对新版本的 bugfix 发布(即 1.X.Y 版本号的 Y 值更高)进行构建是安全的。新较小的版本可能不兼容 ABI,因此更改更困难。如果错误仅影响某些用例(例如,版本 < 1.20.3 使用 f2py 在 Windows 上不起作用),则无法更新锁定,因为这将影响 oldest-supported-numpy 的向后兼容性。在这种情况下,建议您直接在自己的 pyproject.toml 文件中添加所需的约束。例如

[build-system]
requires = [
    "wheel",
    "numpy==1.19.0; python_version<='3.8' and platform_system=='Windows' and platform_python_implementation != 'PyPy'",
    "oldest-supported-numpy; python_version>'3.8' or platform_system!='Windows' or platform_python_implementation == 'PyPy'",
    # more requirements (if needed) ...
]

请注意,当您这样做时,重要的是要确保条件是,对于给定的平台配置,恰好有一个可能的锁定。否则,您的构建将失败,或者 pip 可能会拒绝在 该配置上安装您的包(因此您可能看不到 CI 中的它)。oldest-supported-numpy 仓库包含测试,因此出于安全考虑,您可能希望在它的 setup.cfg 中实现约束,并使用 pytest 运行测试以验证这些约束。

为什么 oldest-supported-numpy 不可用于 Conda、Homebrew、Debian 等?

pyproject.toml 格式是 PyPI 特有的。其他打包系统有自己的元数据格式和指定依赖项的方式。通常,它们不需要像 oldest-supported-numpy 这样的东西,因为要么(a)它们为每个发布版本仅提供单个 NumPy 版本(通常是 Linux 发行版和 Homebrew 的情况),要么(b)它们有更明确的管理 ABI 兼容性的方式(例如,参见 conda-forge 的 pin_compatible 功能:https://forge.conda.org.cn/docs/maintainer/knowledge_base.html#linking-numpy)。

关于为这个包起一个更吸引人的名字呢?

当前的名字在包名称中并不是很吸引人,但它非常具有描述性。这个包仅用于在 pyproject.toml 文件中定义构建时依赖项,因此更重要的是有描述性的名字,而不是吸引人的名字!

如果我认为某个绑定是错误的或过时的怎么办?

如果您认为有问题或可以改进的地方,请随时创建一个问题或提交一个pull request!

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源代码分发

oldest-supported-numpy-2023.12.21.tar.gz (5.2 kB 查看哈希值)

上传时间 源代码

构建分发

oldest_supported_numpy-2023.12.21-py3-none-any.whl (4.9 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面