我们都知道python有一个一直被诟病的毛病,python2与python3代码不兼容问题,而网上的一些教学大部分都是python2的,如果需要将其在python3环境下运行,有两个方法,一是:一个一个参考文档,对其中的库在3中的修改对应修改;二则是使用python内置工具2to3.py对代码进行批量修改。
首先找到2to3.py文件位置,一般是在“\Python\Python36-32\Tools\scripts”这样的文件层内,具体要看自己python安装的位置。
接着在此文件夹内按shift+鼠标右键,在此处打开命令窗口
输入
python 2to3.py
后接不同代码有不同效果
直接接需要修改的py文件可以将修改结果显示
python 2to3.py C:\Users\Administrator\Desktop\ocr\server.py
直接接文件夹位置可以批量修改
接-w加文件可以将修改的文件覆盖到原文件并留有.bak的备份文件用来恢复
python 2to3.py -w C:\Users\Administrator\Desktop\ocr\server.py
python2原文件
修改后python3文件
-w -n效果是修改但不留备份文件
-f 给出明确的修复集
2to3 -f imports -f has_key example.py
有时候2to3会在您的源代码中找到需要更改的地方,但2to3无法自动修复。在这种情况下,2to3会在文件的diff下面打印警告。您应该解决此警告,以获得兼容的3.x代码。
以前刚学Python的时候就用过Python自带的那个库,2to3,记得当时没成功,今天练习tornado的时候时候又碰到2转3的问题,又尝试了下,发现还挺简单的。。。
Python2 asr.py文件的代码:
#asy.py
import time
import thread
def long_io(callback):
"""将耗时的操作交给另一线程来处理"""
def fun(cb): # 回调函数作为参数
"""耗时操作"""
print "开始执行IO操作"
time.sleep(5)
print "完成IO操作,并执行回调函数"
cb("io result") # 执行回调函数
thread.start_new_thread(fun, (callback,)) # 开启线程执行耗时操作
def on_finish(ret):
"""回调函数"""
print "开始执行回调函数on_finish"
print "ret: %s" % ret
print "完成执行回调函数on_finish"
def req_a():
print "开始处理请求req_a"
long_io(on_finish)
print "离开处理请求req_a"
def req_b():
print "开始处理请求req_b"
time.sleep(2) # 添加此句来突出显示程序执行的过程
print "完成处理请求req_b"
def main():
req_a()
req_b()
while 1: # 添加此句防止程序退出,保证线程可以执行完
pass
if __name__ == '__main__':
main()
在pycharm终端执行:
2to3 -w asy.py
-w 是直接覆盖源文件,然后会生成一个asy.py.bak的备份文件,
执行后的结果代码就变成Python3语法的了:
import time
import _thread
def long_io(callback):
"""将耗时的操作交给另一线程来处理"""
def fun(cb): # 回调函数作为参数
"""耗时操作"""
print("开始执行IO操作")
time.sleep(5)
print("完成IO操作,并执行回调函数")
cb("io result") # 执行回调函数
_thread.start_new_thread(fun, (callback,)) # 开启线程执行耗时操作
def on_finish(ret):
"""回调函数"""
print("开始执行回调函数on_finish")
print("ret: %s" % ret)
print("完成执行回调函数on_finish")
def req_a():
print("开始处理请求req_a")
long_io(on_finish)
print("离开处理请求req_a")
def req_b():
print("开始处理请求req_b")
time.sleep(2) # 添加此句来突出显示程序执行的过程
print("完成处理请求req_b")
def main():
req_a()
req_b()
while 1: # 添加此句防止程序退出,保证线程可以执行完
pass
if __name__ == '__main__':
main()
不过感觉这个标准库也就处理一下print这种简答的语法转换,我再换一个腾讯实时转写的接口代码就不行了,虽然也对urlib做了转换,但还是需要手动改一些。
不过能转print也方便不少了
ps:想吐槽Python2和Python3的兼容!
pps:详细内容请看官方文档,已经有中文的官方文档了!虽然还不太全