Max*_*nov 3 python pip setuptools
问题
我的代码依赖于两个包A
和B
.
最近我发现了一个包兼容性问题:包的维护者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)
不幸的是,这并不是这个问题的解决方案,因为无法涵盖使用环境标记在 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
其他任何地方。如果您需要对更多架构进行细粒度控制(例如arm
与i686
等分开),请添加更多需求字符串。
参考:PEP 508,环境标记。
归档时间: |
|
查看次数: |
490 次 |
最近记录: |