这几天在做项目打包的时候,因为要保护知识产权,所以将py文件编译成pyc文件再打包。
于是研究了一下,编译的方法很简单,用compileall.compile_dir()函数就可以了。
首先,将项目拷贝到一个目录(过滤掉.开头的隐藏文件),然后编译,最后删除.py文件。这里有一个问题,就是原来的源码目录下可能已经有pyc了,所以在编译的时候要指定force=1强制编译一下,覆盖掉这些文件。
下面是打包脚本:
BUILD_PATH = 'build/'
PROJECT_PATH = 'src/'
import os
import os.path
import shutil
import re
# copy project files
print "copying project files"
def ignore(src,files):
results = []
for f in files:
if re.match(r'\..*',f):
results.append(f)
return results
src = PROJECT_PATH
dst = BUILD_PATH
dst_dir = os.path.dirname(dst)
if os.path.isdir(BUILD_PATH):
shutil.rmtree(BUILD_PATH)
os.makedirs(BUILD_PATH)
shutil.copytree(src, dst,ignore=ignore)
# compile python source
print "compiling python source"
import compileall
compileall.compile_dir(BUILD_PATH,quiet=0,force=1)
for fs in os.walk(BUILD_PATH):
for f in fs[2]:
if re.match(r".*\.py$",f):
f_f = fs[0]+'/'+f
print "removing "+f_f
os.remove(f_f)
print "done"