如何为32位与64位Python指定不同的包依赖要求?
问题
我的代码依赖包A和B,遇到以下兼容性问题:
- 包
A的维护者停止为32位Python发布whl包 - 包
B的维护者移除了A依赖的部分功能,导致32位Python环境下代码运行失败 - 64位Python环境下所有包兼容正常
若统一限制B的版本上限,对64位环境并不合理——64位环境更适合使用最新版本的包,同时需要让32位Python通过指定旧版本包平稳运行。
疑问
能否针对Python位版本(32位/64位)指定不同的包依赖要求?当前setup.py中的install_requires字段为通用配置,不支持位版本区分。
补充信息
setup.py片段:
install_requires=[ 'A', 'B', ]
开发环境安装命令:
$ pip install -e .
更新说明
需明确区分的是Python的位版本(32位vs64位),而非操作系统架构。自行想到的解决方案如下:
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, )
想确认是否有更优方案。
解决方案
你的现有方案可行,但还有更符合Python打包规范的实现方式——利用setuptools的环境标记(Environment Markers),无需手动判断Python位版本,让pip在安装时自动匹配对应环境的依赖。
1. 环境标记写法示例
直接在install_requires中通过标记区分32位和64位Python:
from setuptools import setup setup( ... install_requires=[ # 32位Python:指定A和B的旧版本 'A<=1.0; sys.maxsize <= 2**32', 'B<=1.0; sys.maxsize <= 2**32', # 64位Python:使用最新版A和B 'A; sys.maxsize > 2**32', 'B; sys.maxsize > 2**32' ] )
如果需要限定Python版本或实现,可以补充标记,比如:
'A<=1.0; python_version >= "3.6" and sys.maxsize <= 2**32'
2. 两种方案对比
- 手动判断方案:简单直接,但依赖在
setup.py执行时确定,若用户通过预构建的wheel安装,判断逻辑不会触发;跨平台构建wheel时可能出现依赖不匹配问题。 - 环境标记方案:依赖声明是静态的,完全符合PEP 508规范,pip会根据当前运行环境自动筛选对应依赖,支持wheel的正确分发,更适合正式打包场景。
3. 测试建议
分别在32位和64位Python环境下执行pip install -e .,检查安装的依赖版本是否符合预期,确保两种环境下的依赖配置都生效。
内容的提问来源于stack exchange,提问作者Maxim Ivanov
相关产品推荐
相关产品推荐

