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程序万无一失。
方法命名最好不要和内置函数什么的撞名了吧。