1. 为什么要加密Python程序
- 对于一些私有的库,或者付费使用的python包,可以通过编译把.py转译成.pyd加密的不可阅读源代码的形式。而包的调用仍然可以使用
import pkg
的形式
2. 核心方法和教程
2.1 python环境
需要安装Cython
pip install Cython==3.0.8
2.2 核心代码
setup.py 核心代码
作用:用于将.py文件转译成.pyd文件
import os
import sys
import shutil
from distutils.core import setup
from Cython.Build import cythonize
from distutils.command.build_ext import build_ext
def get_export_symbols_fixed(self, ext):
pass # return [] also does the job!
# replace wrong version with the fixed:
build_ext.get_export_symbols = get_export_symbols_fixed
if __name__ == '__main__':
if os.path.exists('build'):
shutil.rmtree('build')
# print('argv: ', sys.argv, len(sys.argv))
appname = sys.argv[3]
pypath = sys.argv[4]
sys.argv = sys.argv[:3]
# print('argv: ', sys.argv, len(sys.argv))
cpath = pypath.replace('.py', '.c')
if os.path.exists(cpath):
os.remove(cpath)
setup(
name=appname,
ext_modules=cythonize(pypath)
)
if os.path.exists(cpath):
os.remove(cpath)
py2pyd.py 单个.py文件转换执行器
作用:内置参数,用于调用setup.py程序,执行该程序可以完成.py到.pyd
import os
os.system(fr"python setup.py build_ext --inplace xxxx.\source\xxxx.py")
py2pyd2.py 文件夹中.py文件转换执行器
作用:内置参数,用于调用setup.py程序,执行该程序可以完成文件夹内所有.py到.pyd,支持深度遍历文件夹(支持多层文件夹嵌套)
import os
def dir_files(dir_path: str) -> list:
files = []
py_files = []
path_list = []
if not os.path.exists(dir_path):
logging.info(f"{dir_path}文件夹不存在")
else:
for dirpath, dirnames, filenames in os.walk(dir_path):
path_list.append(dirpath)
for filename in filenames:
files.append(os.path.join(dirpath, filename))
if filename.endswith(".py"):
py_files.append(os.path.join(dirpath, filename).replace("\\", "/"))
# print(os.path.join(dirpath, filename))
return py_files
dir_path = './page_demo/source'
py_files = dir_files(dir_path)
for file in py_files:
os.system(fr"python setup.py build_ext --inplace test {file}")
3. 使用教程
3.1 新建page_demo文件夹用于测试
文件夹名称可以随意命名
3.2 将跑pyd.py和setup.py文件copy到page_demo文件夹中
3.3 在page_demo中新建source文件夹
3.4 在source文件夹中放入要加密的文件(以hello.py为例)
3.5 将py2pyd.py文件中的 .\source\hello.py 修改成需要加密的.py文件
3.6 运行py2pyd.py,会在page_demo文件夹中出现一个.pyd的文件
3.7 打包模块测试
在page_demo文件夹中新建demo.py文件,导入这个模块,使用模块中的函数测试打包是否成功
4. 问题和解答
- 支持多层文件文件夹嵌套吗?
- 支持,多层文件和文件夹嵌套,会递归找出所有的python文件,并转译成.pyd文件
- 支持,多层文件和文件夹嵌套,会递归找出所有的python文件,并转译成.pyd文件
- 支持的python解释器版本是多少?
- 支持python3.6 3.7 3.8 3.9 python3.10(3.10只支持低版本,高版本打包会出错)
- 打包后效率有什么变化?
- 效率提升了:对于纯计算代码,打包成pyd的性能与用python3调用相比,性能约提高一倍
- 用于测试的代码片断
import time
def sum_int():
start_time = time.time()
a = (x for x in range(4*10 ** 8))
sum_int = 0
for i in a:
sum_int += i
print(sum_int)
print(f'cost_time:{time.time() - start_time}')
if __name__ == "__main__":
sum_int()
5. 打包工具
演示效果
- 如果不想写使用源代码加密可以使用封装好的EncryptTool.exe
- 工具采用了PyQT5框架做桌面应用搭建,欢迎下载。
工具下载
GIT地址:gitee.com/mtoooo/py2-…