这是一个元包,提供了支持给定Python版本和平台的最早版本的NumPy。如果该平台在PyPI上只有更新版本的NumPy的预构建轮子,则指定该NumPy版本。
项目描述
关于
这是一个元包,可以在 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.toml、setup.cfg 或 setup.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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 71d89c31bb567814e47e2e268eb2e92b6f99f5ce76f4c3db30833624e9ef29e0 |
|
MD5 | a2ef01b917cec33780bb5e7e0f0aa274 |
|
BLAKE2b-256 | 1aa786bd933619916fb5982b106ed8ea16618c28894131ad5a61403e62067566 |
oldest_supported_numpy-2023.12.21-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 42002178aef017afd0e34cc9dd27b56005aa619276392a4460a01359969476c2 |
|
MD5 | 4f1a1dd999b3c7c76d2a1b1592fb27a6 |
|
BLAKE2b-256 | dc5ce3c84cfdd488701aa074b22cf5bd227fb15d26e1d55a66d9088c39afa123 |