如何为Python 2.7与3.x打包模块?解决跨版本依赖差异
解决Python2/3兼容模块的mock依赖问题
这问题我之前维护双版本兼容项目时也碰到过,其实有几种靠谱的解决思路,咱们一个个捋:
1. 用Setuptools的环境标记(最推荐)
Setuptools支持environment markers,可以直接在install_requires里写条件,让pip根据用户的Python版本自动决定是否安装依赖,完全不用管你在哪个环境打包。
写法很简单:
from setuptools import setup setup( name="your-module-name", version="1.0.0", # 其他必要配置(比如packages、author等)... install_requires=[ # 只有Python2.x才安装mock 'mock; python_version < "3.0"' ] )
这个标记会被pip正确解析:Python3用户安装时会忽略mock,Python2用户则会自动拉取这个包。而且生成的wheel包会包含这个条件逻辑,不管你是在Python3还是Python2环境打包,用户那边都能正常处理。
2. 在setup.py里动态判断Python版本
如果你的项目需要兼容比较老的Setuptools版本(不支持environment markers),可以直接在setup.py里通过sys.version_info动态添加依赖:
import sys from setuptools import setup install_requires = [] # 仅当Python版本小于3.0时添加mock依赖 if sys.version_info < (3, 0): install_requires.append("mock") setup( name="your-module-name", version="1.0.0", install_requires=install_requires, # 其他配置... )
你完全不用担心在Python3环境打包会导致Python2用户装不上mock——因为setup.py是用户安装时在他们自己的环境里执行的,不是你打包时执行的。所以用户的Python2环境运行setup.py时,会自动加上mock依赖,完全没问题。
3. 代码层面的导入兼容(补充手段)
上面两种是依赖管理层面的解决,代码里最好也做一下导入兼容,避免用户环境意外缺失依赖时直接报错:
try: # Python3 自带unittest.mock from unittest.mock import Mock, patch, MagicMock except ImportError: # Python2 用第三方mock包 from mock import Mock, patch, MagicMock
不过这个只是兜底方案,核心还是要靠setup.py的依赖配置来确保用户环境有对应的包,不然Python2用户安装后运行代码还是会因为找不到mock而报错。
内容的提问来源于stack exchange,提问作者Daniel Quinn
相关产品推荐
相关产品推荐

