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 compilealldef re_build(src_dir=""):print("********************************************")for base_dir,dir_name,file in os.walk(src_dir):for item in dir_name:# find the __pacache__ dirif item.find("__pycache__")!=-1:for dp,dn,file_list in os.walk(os.path.join(base_dir,item)):for file in file_list:if file.find(".cpython")!=-1:new_name=file[:file.find(".cpython")]+file[file.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,file),os.path.join(base_dir,new_name))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就可以了。