一、问题背景
pyinstaller是一个很好的工具,可以把Python工程文件打包成可执行文件
这样的好处很多,可以避免源码泄露,也方便用户阅读和管理
但是当程序集涉及到动态库的时候,常规操作无法将动态库自动打包到可执行文件中
举个例子,下图所示的程序集中有需要用到两个".so"的动态库
--bin
--data
--lib
--model
--config
main.py
link1.so
link2.so
我们使用常规指令对该程序集进行打包
pyinstaller --key mypassword -F main.py
# --key mypassword: 设置打包密码,防止反编译
# -F 将程序集打包成一个可执行文件
上述打包指令执行完成后,在当前文件夹会生产一个"disk"文件夹,里面有一个"main"的可执行文件
最终需要把下述三个文件同时放在一起,可执行文件"main"才能正常执行
main
link1.so
link2.so
现在的想法是,在pyinstaller打包过程中把两个".so"动态库也编译到可执行文件中
经过一番探索,这个想法是可以实现的,需要用到配置文件".spec"
二、pyinstaller打包动态库
1. 首先生成配置文件
pyi-makespec --key mypassword -F main.py
# -*- mode: python ; coding: utf-8 -*-
block_cipher = pyi_crypto.PyiBlockCipher(key='mypassword')
a = Analysis(['main.py'],
pathex=['/home/root/test'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
2. 修改配置文件
配置文件中Analysis[binaries]专门用来放置动态库的位置,不过格式稍微有些特殊
# -*- mode: python ; coding: utf-8 -*-
block_cipher = pyi_crypto.PyiBlockCipher(key='mypassword')
a = Analysis(['main.py'],
pathex=['/home/root/test'],
binaries=[("/home/root/test/link1.so", "."),("/home/root/test/link2.so", ".")],
datas=[],
、、、
3. 利用配置文件生成可执行文件
pyinstaller -F main.spec
大功告成
顺便提一句,如果有素材(图标、模型、文件等)需要打包,则直接把路径填写到Analysis[data]中即可
参考资料:
Pyinstaller 打包发布经验总结
Pyinstaller打包py文件简明教程
pyinstaller官方文档
网友评论