加密Python源代码笔记

本人基于项目需求,从网上搜集了一些关于Python源代码加密的内容,在此作一个总结,以供参考。html

加密Python源代码主要有几下方法:

  • 将py文件编译成pyc、pyo文件进行发布
# 编译成pyc的方法以下:

# 编译单个文件

# 命令行下:
python -m py_compile /path/to/待编译.py 

# python代码:
import py_compile 
py_compile.compile(r'/path/to/待编译.py') 

# 编译多个文件,未试验过,目测须要将待编译文件都放入一个文件夹中,且不能包含其余文件

# 命令行下:
python -m py_compile /path/to/{待编译脚本1,脚本2,...}.py
# 或者
python -m py_compile /path/to/

# python代码:
import compileall
compileall.compile_dir(dirpath)

# 编译成pyo的办法以下:
# 注:pyo仅为pyc的一种优化格式,并非说加密程度会更高
python -O -m py_compile /path/to/待编译.py
须要注意的是,编译成pyc或者pyo文件后须要将命名改为与源Python命名一致,将其放在源目录下,虽然其余python文件调用pyd时显示不能检测到该模块,但实际上能够运行。

因为pyc的编译收到python版本的影响,因此当将编译后的pyc迁移到另外一台电脑中时,最好保持python环境一致。
  • 打包成可执行文件python

    通过简单的调查,发现pyinstaller这个打包工具比较受人欢迎,经它打包后的exe文件能够在无python的环境下运行。所以本人对此进行了测试,结果发生报错,具体报错内容忘了,可是大致意思是打包时关联内容挖掘的过深,超过最大限度,估计缘由多是项目中代码的引用内容过多,或者是引用内容的依赖包过多,致使没法成功打包。web

  • 使用cpython将python代码编译成C/C++,而后再编译成python扩展模块,windows上为pyd文件,Linux上为so文件shell

    注:pyd文件实际就是dll文件windows

# 编译成pyd的方法以下:

# 命令行下:(在项目目录下打开命令行或者shell,该命令只能编译一个文件,编译以后会发现出现三个文件,yourmod.c、yourmod.html、yourmod-win_amd64.pyd,此时将c、html和原py文件删除,将pyd文件命名更改成yourmod就能够)
cythonize -a -i yourmod.pyx

# python代码:(在原项目中编写setup.py文件)

from distutils.core import setup
from Cython.Build import cythonize
import os

''' 该文件的执行须要的在Terminal中输入 python setup.py build_ext --inplace !!! 使用Cpython 编译python文件,关键函数编译成pyd文件(至关于dll) '''
# 针对多文件状况设置,单文件就只写一个就行
key_funs = ["yourmod1.py", "yourmod2.py", "yourmod3.py"]

setup(
    name="XX app", 
    ext_modules = cythonize(key_funs),
)

''' 一、将编译后的pyd文件的命名更改为与原py文件一致 二、删除编译后获得的c文件和原py文件 '''

print("——————", os.getcwd(), "——————")

files = os.listdir(os.getcwd())
print(files)

for fi in files:
    if fi.__contains__(".pyd"):
        re_name = fi.split(".")[0] + ".pyd"
        print(re_name)
        os.rename(fi, re_name)
    elif fi.__contains__(".c") or fi in key_funs:
        os.remove(fi)

# 运行方式 在原目录的命令行下执行
python setup.py build_ext --inplace
须要注意的是pyd文件在被其它python文件调用时依然不能被识别,但可以运行,并且setup.py的文件的执行须要的在Terminal中输入   python setup.py build_ext --inplace !!!

基于pyc、pyo容易破解的缘由,建议使用pyd文件进行发布,但python3下pyc、pyo文件的破解本人未经试验,只是据说,故具体选择哪一种方式你们可根据具体状况进行选择。