pyinstaller编译及二进制文件的运行

安装

pip install pyinstaller

分析:

pyinstaller会通过import链找到所有需要的文件,分析代码以发现脚本执行所需的所有其他模块和库。然后收集所有这些文件的副本——包括活动的 Python 解释器!– 并将它们与主脚本放在一个文件夹中,或者放在一个可执行文件中

编译:

-F,--onefile 产生单个的可执行文件
-D,--onedir 产生一个目录(包含多个文件)作为可执行程序
-a,--ascii 不包含 Unicode 字符集支持
-d,--debug 产生 debug 版本的可执行文件
-o DIR,--out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-n NAME,--name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
-p DIR,--path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Linux 使用冒号)来分隔多个路径
--add-data--add-binary 指示 PyInstaller 将其他数据或二进制文件插入到构建中
--exclude-module 在可执行文件中排除某些模块(不包含)
–hidden-import 隐藏相关模块的引用

运行:

单文件运行原理
二进制启动时,会在/tmp目录下生成一个 _MEIxxxx的文件夹,二进制中包含其需要的所有 Python 模块文件,以及任何非 Python 支持文件(例如.so文件)的压缩副本。bootloader解压缩这些文件并将副本写入临时文件夹,这可能需要一点时间,这就是为什么单文件应用程序比单文件夹应用程序启动要慢一些的原因。
创建临时文件夹后,程序完全按照单文件夹模式运行,使用临时文件夹的上下文。当程序结束时时,bootloader会删除临时文件夹。
如果程序崩溃或被终止(Unix 上的 kill -9,Windows 上的任务管理器终止,macOS 上的“强制退出”),则不会删除该文件夹。因此,如果您的应用程序经常崩溃,您的用户将失去多个临时文件夹的磁盘空间。

常见问题指引

https://pyinstaller.org/en/stable/when-things-go-wrong.html

进阶(深入了解)

详细的bootloader过程:

bootloader启动:

1、单文件模式,将相关文件解压缩到/tmp/_MEIxxxx;
2、修改各种环境变量:将 LD_LIBRARY_PATH 的原始值保存到 LD_LIBRARY_PATH_ORIG。将自己的路径即/tmp/_MEIxxxx添加到 LD_LIBRARY_PATH;
3、为两个进程设置处理信号;
4、运行子进程;
5、等待子进程运行完成;
6、删除/tmp/_MEIxxxx目录;

bootloader本身作为子进程启动:

1、加载动态库,动态库的名字在编译时已写在了二进制文件里;
2、初始化python解释器,设置sys.path, sys.prefix, sys.executable;
3、运行python代码;
https://pyinstaller.org/en/stable/advanced-topics.html

参考附录:

https://realpython.com/pyinstaller-python/
https://pyinstaller.org/en/stable/operating-mode.html
https://github.com/pyinstaller/pyinstaller/wiki/Supported-Packages

你可能感兴趣的:(pyinstaller编译及二进制文件的运行)