Python 2to3修复程序的哪些子集输出有效的Python 2代码?
我不想一次全部使用Python 3,而是想使用2to3来获取大部分信息,稍后保存真正多毛的东西(例如unicode更改),或者可能使用{{1}两者都支持。我希望six
完成一次初始传递,但是我希望它生成有效的Python 2代码作为中间步骤。
注意:我知道a similar question,但并未真正回答。
答案 0 :(得分:1)
我最近找到了一个工具futurize
可以为您完成此任务。在EPEL中,甚至还有CentOS 6的RPM(我在工作中的某些机器上一直使用)–它是python-future
。
http://python-future.org/automatic_conversion.html-阶段1是“与python软件包兼容的python 3的准备”。我发现第2阶段还需要安装其他软件包,但是在复制脚本时其他机器上却没有。
一个例子:
futurize -l -f all -f idioms -f ws_comma -x long *py
添加-w
将为您写出更改。
答案 1 :(得分:-1)
我认为您不会找到一个。最好的方法是使用#!语法,指示要使用的Python,并在准备好使用每个Python时使用2to3。 (如果您使用的是Windows,请查看Python launcher,以使共存更加容易。)
我写了一个模块,它需要同时使用2和3。而且我的代码看起来像这样:
import sys
PYTHON3 = sys.version_info.major == 3
PYTHON2 = sys.version_info.major == 2
if PYTHON2:
import StringIO
stringio = StringIO.StringIO
bytesio = StringIO.StringIO # In Python2, stringIO takes strings of binary data
import urllib2
URL_open = urllib2.urlopen
HTTPError = urllib2.HTTPError
if PYTHON3:
import io
stringio = io.StringIO
bytesio = io.BytesIO # In Python3, use BytesIO for binary data
import urllib.request
URL_open = urllib.request.urlopen
import urllib.error
HTTPError = urllib.error.HTTPError
分散在诸如以下的地方:
if PYTHON2:
f = stringio(self.XMLData)
if PYTHON3:
f = bytesio(self.XMLData.encode(encoding="utf-8"))
这不是一种表达在两种系统中都可以使用的行的方式。您需要进行很多这样的修补。除非您有一个用例(像这样),否则出于某些原因必须在一个模块中同时支持Python2和Python3,这确实不值得。
我的用例相对简单。您所指的similar question指向Dive Into Python "Porting Code to Python 3 with 2to3" chapter,它显示了多少不同之处,其中许多是不兼容的不同,需要大量的条件编码,例如以上。我不推荐。