py2to3--将python2项目转成python3项目


  • 前言
  • py2to3简介
  • 代码分析
  • 2to3.py
  • py2to3.py
  • del_bak.py
  • test 和 test.py



  • 结尾


前言

习惯python3的写法就不愿意用python2的语法规则。碰巧碰到了一个大型的python2项目。所以这时候py2to3就诞生了

py2to3简介

2to3的简单集合,主要实现目标:将一个python2项目全部转换为python3,所以现在就只有一个参数–目标项目的绝对路径(或者相对与main function的相对路径)

py2to3项目地址

现在就实现了主要的转换功能, 也希望可以帮助到需要用到的同学, 如果你有需要或者感兴趣, 可以尝试着给这个项目提交issue或者pr

代码分析

2to3.py

还可以通过 pip install 2to3 安装官方2to3模块

import sys
from lib2to3.main import main

sys.exit(main("lib2to3.fixes"))
py2to3.py

通过递归遍历目标项目文件夹下的所有文件,把python文件都进行一遍转换,2to3模块会自动识别文件内容并转换

参数为目标文件的绝对路径或者相对于该文件的相对路径

#-*- coding:utf-8 -*-
import os
import sys
WIN = sys.platform.startswith('win')
if WIN:
path_sprit = '\\'
else:
path_sprit = '/'

def py2to3(path):
'''
:param path: Absolute path to the target project folder
:return: no return
'''
for i in os.listdir(path):
path2 = os.path.join(path, i)
if os.path.isdir(path2): # 如果为文件夹,则进入递归
py2to3(path2)
else:
if 'py' == i.split('.')[1] and len(i.split('.')) == 2: # 如果不为文件夹并且为python文件则进行转换
dir = path+path_sprit+i
print(dir)
print(os.system(r'python 2to3.py -w %s' % dir))
# Make the conversion if you through: pip install 2to3 .can use: os.system(r'2to3 -w %s' % dir)


if __name__ == '__main__':
print('Please provide an absolute path parameter.')
try:
path = sys.argv[1]
print(("Let's look in %s." % path))
except:
print("Error, You Need Offer A Filepath!!! ")
py2to3(path)

试例:

python py2to3.py 目标项目路径

del_bak.py

2to3模块转换成功之后,并不会删除原来的python2文件,而是将其备份为***.bak的文件。将del_bak.py与py2to3.py分开,是为了让自己有个“ 后悔 ”的机会,如果需要删除bak文件就运行这个吧,参数要求同py2to3.py

参数:目标文件的绝对路径或者相对于该文件的相对路径

ps: 需要注意的是,现在整体结构并不完善,使用del_bak.py的时候一定要注意路径拼写,假若你现在是root权限,而且不小心参数写了 ’ / ’ 那就会把电脑里所有的bak后缀的备份文件删掉!!!所以欢迎大家来完善code

#-*- coding:utf-8 -*-
import os
import sys
WIN = sys.platform.startswith('win')
if WIN:
path_sprit = '\\'
else:
path_sprit = '/'

def del_bak(path):
'''
:param path: Absolute path to the target project folder
:return: no return
'''
for i in os.listdir(path):
path2 = os.path.join(path, i)
if os.path.isdir(path2): # 如果为文件夹,则进入递归
del_bak(path2)
else:
if len(i.split('.')) == 3:
if 'bak' in i.split('.')[2]:
dir = path+path_sprit+i
print(dir)
os.remove(dir)


# tochange(path)
if __name__ == '__main__':
print('Please provide an absolute path parameter.')
try:
path = sys.argv[1]
print(("Let's look in %s." % path))
except:
print("Error, You Need Offer A Filepath!!! ")
del_bak(path)

试例:

python del_bak.py 目标项目路径


test 和 test.py

/test 中是我放的例子

py2to3--将python2项目转成python3项目_绝对路径

如果测试完之后还不过瘾,可以通过 test.py 重建 /test

#-*- coding:utf-8 -*-
import os
import sys

from del_bak import del_bak

WIN = sys.platform.startswith('win')
if WIN:
path_sprit = '\\'
else:
path_sprit = '/'

CODE = '''print 123'''

filename = 'test_.py'

def test_file(path):
'''
:param path: Absolute path to the target project folder
:return: no return
'''
for i in os.listdir(path):
path2 = os.path.join(path, i)
if os.path.isdir(path2): # 如果为文件夹,则进入递归
file_name = path2+path_sprit+filename
with open(file_name, 'w') as file:
file.write(CODE)
print(file_name)
test_file(path2)
else:
print(path2)
with open(path2, 'w') as file:
file.write(CODE)

if __name__ == '__main__':
print("to rebuild the testfile")
del_bak('./test')
test_file('./test')

结尾

欢迎各位老爷评论点赞????, 若对该项目感兴趣的老爷们欢迎来贡献或者提交issue, 希望可以帮助到你. 项目地址