把python文件打包成二进制文件,封装代码,达到保护代码的目的

通过cpython把python的文件转换为二进制文件,达到代码保护的目的

参考文档  http://docs.cython.org/en/latest/


1、下载Cython-0.28.2.tar.gz 
    python setup.py install安装


2、创建你需要打包成二进制的python文件
    test.py
    def hello(s):
        print(s)


3、创建一个setup.py文件,内如如下:
    from distutils.core import setup
    from Cython.Build import cythonize


    setup(
        name = "test",
        ext_modules = cythonize("test.py")
    )


4、运行编译程序
    python setup.py build_ext --inplace


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





你可能感兴趣的:(python)