Python源代码加密的几种方法

1. 将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环境一致。

2. 打包成可执行文件

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

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

# 编译成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),
)

'''
1、将编译后的pyd文件的命名更改成与原py文件一致
2、删除编译后得到的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文件实际就是dll文件 需要注意的是pyd文件在被其它python文件调用时依然不能被识别,但能够运行,而且setup.py的文件的执行需要的在Terminal中输入 python setup.py build_ext --inplace !!! 基于pyc、pyo容易破解的原因,建议使用pyd文件进行发布。

4. 利用第三方进行加密

1 . pyminifier 2. http://pyob.oxyry.com/
凉葱落

凉葱落python开发工程师