2019-12-19更新
又发现一个bug,因为python2和python3中的/也有区别,如果除数和被除数都是int型,python2中/的结果会取整,python3中/的结果则是float型,//的结果才会取整。也要注意一下子哟~
问题背景
笔者在做OSTEP的作业时,下载的源码是python2的,由于笔者windows环境下只装了python3,故每次都是利用python安装目录Tools/scripts中的2to3.py工具将python2程序转换成python3程序,此前几次该操作贼稳,没想到今天翻车了,debug一番发现了错误在此记录下来。
问题回顾
使用2to3.py

记得加-w参数,不然只是将要改的地方输出在屏幕上。
执行该命令后,原来的python2程序就转换成了python3程序。
运行转换后的x86.py


不成想翻车了,报了UnboundLocalError的错误。
在pycharm中添加命令行参数
为了调试方便,决定在pycharm中debug。此前也没用过在pycharm中添加命令行参数。
这样操作:
Run -> EditConfigurations
在Configuration中的Parameters栏加入命令行参数即可。

运行后当然一样的报错:

问题解决
根据提示,跳转到895行看看转换后的程序和转换前的程序有什么区别:
转换后:

转换前:

将next(procs)改成procs.next()
无奈还是报错:

赶快去看下prolist中的next方法!
转换后:

转换前:

注意到转换后的next方法前后加了双下划线。为什么其他函数转换时没有加上前后双下划线呢,应该与next方法是python的内置函数有关。
故再将__next__改成next后问题解决。

问题总结
不要以为2to3.py将python2程序转换成python3程序万无一失。
方法命名最好不要和内置函数什么的撞名了吧。
2627

被折叠的 条评论
为什么被折叠?



