Python 2.7+兼容库print语法报错,求无需回退版本的兼容方案
你遇到的情况太常见了——不少声称支持Python2.7+的库,其实没彻底处理好Python2和3之间的语法差异,print语句/函数就是最典型的坑之一。不用急着回退到Python2.7,有现成工具能帮你在Python3环境下直接运行无括号的print代码,完全不用修改原库或示例脚本。
首选工具:future库
future是专门解决Python跨版本兼容性的工具库,它能让Python3完美兼容Python2的部分语法和内置特性,正好能解决你的print报错问题:
步骤1:安装future
在终端执行以下命令完成安装:
pip install future
步骤2:让Python3识别无括号print
有两种不用修改原代码的实现方式:
临时测试方式:如果只是想快速跑一遍示例脚本,可以用Python命令行参数先导入兼容模块再执行脚本:
python -c "from past.builtins import print; exec(open('你的示例脚本文件名.py').read())"把
你的示例脚本文件名.py替换成你实际要运行的脚本即可。持久生效方式:如果需要频繁运行这类代码,可以在项目的入口文件开头添加一行导入:
from past.builtins import print这行代码会把Python2风格的
print语句注册到Python3环境中,之后所有无括号的print调用都能正常执行。
为什么这个方法管用?
Python3把print改成了内置函数,而past.builtins.print(来自future库)会在Python3环境中模拟Python2的print语句行为——它会自动拦截无括号的print调用,转换成符合Python3语法的函数调用,从根源上避免SyntaxError报错。
备选简易方案(不推荐生产环境)
如果不想安装额外库,还有个临时hack方法(仅适合简单场景):在脚本开头添加一段代码模拟Python2的print行为:
import builtins builtins.print = lambda *args, **kwargs: __import__('sys').stdout.write(' '.join(map(str, args)) + '\n')
不过这个简易实现没法完全复刻Python2print的所有特性(比如print >>sys.stderr这类用法),所以还是优先推荐future库。
内容的提问来源于stack exchange,提问作者Steve Cohen

