本人基于项目需求,从网上搜集了一些关于Python源代码加密的内容,在此作一个总结,以供参考。html
# 编译成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文件的破解本人未经试验,只是据说,故具体选择哪一种方式你们可根据具体状况进行选择。