python3.2以后,使用python -m compileall ./命令编译当前目录及子目录的py文件为pyc时,会在每个目录生成一个__pycache__目录,然后把编译后的pyc文件放入此目录(python2、python3.2之前是在py所在的目录生成pyc文件)。
本人写了一个编译的脚本,主要解决以下两个问题:
1、python3生成的pyc文件,增加了版本号的功能,而如果直接发布带版本号功能的pyc,则应用程序会提示失败
2、为了方便发布程序,将pyc从__pycache__目录copy出来
批量编译的程序如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @file : compile.py
# @author : shlian
# @date : 2018/9/14
# @version: 1.0
# @desc :
import sys
import traceback
import os
import compileall
def re_build(src_dir=""):
print("********************************************")
for base_dir, dir_name, file in os.walk(src_dir):
for item in dir_name: # find the __pacache__ dir
if item.find("__pycache__") != -1:
for dp, dn, file_list in os.walk(os.path.join(base_dir, item)):
for cfile in file_list:
if cfile.find(".cpython") != -1:
new_name = cfile[:cfile.find(".cpython")] + cfile[cfile.rfind("."):]
if os.path.exists(os.path.join(base_dir, new_name)):
os.remove(os.path.join(base_dir, new_name))
os.rename(os.path.join(dp, cfile), os.path.join(base_dir, new_name))
for base_dir, dir_name, file_list in os.walk(src_dir):
for _file in file_list:
if _file in ['main.py', 'compile.py']:
continue
if _file.endswith(".py"):
os.remove(os.path.join(base_dir, _file))
if __name__ == "__main__":
if len(sys.argv) != 2:
print("usage: {0} src_dir".format(sys.argv[0]))
else:
src_dir = sys.argv[1]
src_dir = os.path.join(os.getcwd(), src_dir)
try:
compileall.compile_dir(dir=src_dir, force=True)
re_build(src_dir)
except Exception as ee:
print(traceback.format_exc(ee))
编译的命令只有一行:
compileall.compile_dir(dir=src_dir,force=True)
其他的是处理文件的位置。
可以进一步修改:将pyc放到一个单独的目录,这样发布的时候直接发布pyc或pyo就可以了。