32 位和 64 位的不同 python 包要求

Max*_*nov 3 python pip setuptools

问题

我的代码依赖于两个包AB.

最近我发现了一个包兼容性问题:包的维护者A停止发布 32 位 Python 的 whl 包,同时包的维护者删除了包所依赖的B一些功能。A由于 packageA依赖于 package 中的某些功能B,因此代码在运行时会失败。当使用 64 位 Python 时,问题就消失了 - 所有包都很好地同步。

当然我可以手动抑制 package 的较高版本B,但对于 64 位版本没有意义。最好使用 64 位 Python 的最新版本。然而,有必要让 Python 32 位也能顺利运行,并且使用较旧的软件包版本,我可以自己定义这些版本。

问题

我想知道是否有机会为不同的位版本指定不同的软件包要求。

目前setup.py我们有install_requires字段,但这是通用的而不是特定于位的。

额外信息

摘自setup.py

install_requires=[
    'A',
    'B',
]
Run Code Online (Sandbox Code Playgroud)

我在开发环境中安装我的包:

$ pip install -e .
Run Code Online (Sandbox Code Playgroud)

更新

我可能应该明确提到,在这里我想区分不同的 Python 位版本(32 位与 64 位)而不是操作系统架构。

我设法想出的唯一解决方案是:

is_32_bit = sys.maxsize <= 2**32
if is_32_bit:
    install_requires = ['A<=1.0', 'B<=1.0']
else:
    install_requires = ['A']


setup(
    ...
    install_requires=install_requires,
)
Run Code Online (Sandbox Code Playgroud)

hoe*_*ing 6

更新

不幸的是,这并不是这个问题的解决方案,因为无法涵盖使用环境标记在 64 位操作系统上安装 32 位 Python 的情况。platform_machine只为您提供操作系统级别的架构,而不是 Python 安装本身。

原答案

您应该能够使用platform_machine环境标记来实现此目的:

install_requires=[
    "A<1.0;platform_machine!='x86_64' and platform_machine!='amd64'",
    "A>=1.0;platform_machine=='x86_64' or platform_machine=='amd64'"
]
Run Code Online (Sandbox Code Playgroud)

现在A>=1.0将安装在 64 位架构(x86_64针对 Unix、amd64针对 Windows)以及A<1.0其他任何地方。如果您需要对更多架构进行细粒度控制(例如armi686等分开),请添加更多需求字符串。

参考:PEP 508,环境标记