通过cpython把python的文件转换为二进制文件,达到代码保护的目的
参考文档 http://docs.cython.org/en/latest/
5、得到的test.so文件可以直接当成模块,通过python调用
注意:
1、编译的时候,如果执行命令的目录是python包(里面有__init__.py),则编译的路径会改变
2、当文件改变,或者so文件被删除掉了,重复运行编译命令会重新编译,如果原py文件大小没有改变,so依旧存在,则重新编译不会编译
附带代码:
def py2so(root_dir,file_path):
u"""
@root_dir 应用的上级
@file_path文件的路径
把指定的py文件编译成so文件,如果so文件存在,原py文件没有改变大小,则不编译。
"""
COMPILE_S = u"""
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = "temp",
ext_modules = cythonize("{path}")
)"""
if not os.path.exists(file_path):
return False
setup_file = COMPILE_S.format(path=file_path)
so_file = file_path.replace(".py",".so")
t = tempfile.NamedTemporaryFile(suffix='.py',delete = False)
path = t.name
t.write(setup_file)
t.close()
command = "python {path} build_ext --inplace".format(path=path)
logger.info("command='%s'"%command)
os.chdir(root_dir) #编译的时候,会在这个目录下面生成按照文件路径的so
os.system(command)
os.remove(path) #删除临时文件
if os.path.exists(so_file):#编译好了so之后,删除py文件
os.remove(file_path)
return True