如何通过PyInstaller spec文件将动态加载的算法py文件转为二进制文件
解决方法:将动态加载的算法文件编译为二进制打包进PyInstaller程序
完全可以通过修改spec文件实现你的需求。你当前的写法是把算法py文件作为普通数据文件打包,运行时还是明文暴露的py文件,调整配置后可以让PyInstaller将这些文件编译为字节码/二进制文件存入程序归档,不会暴露源码。
具体修改步骤
1. 调整spec文件配置
- 删除datas列表中
('./share/smartsheetAlgo/*.py','share/smartsheetAlgo')这一行,不再将py文件作为普通数据打包 - 将所有算法文件添加到Analysis的首个参数(待打包源码列表),同时将算法目录加入pathex模块搜索路径
- 算法文件较多时可以用glob批量读取,不用逐个手动添加
修改后的完整spec文件参考:
# -*- mode: python ; coding: utf-8 -*- import glob block_cipher = None # 批量读取所有算法文件 algo_files = glob.glob('./share/smartsheetAlgo/*.py') # 提取算法模块名,后续加入hiddenimports避免动态加载失败 algo_module_names = [f.split('/')[-1].replace('.py', '') for f in algo_files] a = Analysis( # 主程序+所有算法文件加入待打包源码列表 ['stecsmartsheet.py'] + algo_files, # 新增算法目录到模块搜索路径 pathex=['/home/ed/smartsheet','/usr/local/lib/python3.8', './share/smartsheetAlgo'], binaries=[], datas=[ ('./share/original_filenames.txt','share'), ('./share/projects/*.prj','share/projects'), ('./share/icons/*.*','share/icons'), ('./share/icons/actions/*.*','share/icons/actions'), ('./share/icons/charts/*.*','share/icons/charts'), ('./share/icons/status/*.*','share/icons/status'), ('./share/libs/win32/*.*','.'), ], # 原有hiddenimports拼接算法模块名 hiddenimports=['VremAlgoinfo','parseline','statistics','pyqtgraph'] + algo_module_names, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='smartsheet', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True, disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='smartsheet' )
2. 调整主程序动态加载逻辑
原来你应该是通过读取文件路径的方式加载算法py文件,打包后算法模块已经被编译进PyInstaller的PYZ归档中,不需要再读取外部文件,直接按模块名导入即可:
比如原来加载./share/smartsheetAlgo/xxx.py的逻辑,替换为importlib.import_module('xxx')即可正常调用。
额外说明
如果需要更高的加密强度,可以给block_cipher配置AES加密,打包时加上--key=自定义加密密钥参数,PYZ归档里的字节码也会被加密,进一步提升反编译难度。
内容的提问来源于stack exchange,提问作者Srini Durand
相关产品推荐
相关产品推荐

