我们都知道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:详细内容请看官方文档,已经有中文的官方文档了!虽然还不太全

posted on 2022-08-11 08:39  root-123  阅读(1023)  评论(0编辑  收藏  举报