参数使用
https://pyinstaller.readthedocs.io/en/stable/usage.html
D参数生成一个文件夹,里面包含了一个执行文件(默认情况),F参数生成一个可执行文件
c参数弹出一个console窗口用来i/o操作,windows下是默认的,使用w参数指定不要弹出console窗口,i参数指定执行文件的图标
把其他格式图片转成ico格式:https://app.xunjiepdf.com/img2icon/
add-data、add-binary参数用于将某些代码以外的资源文件也一起打包,后面详述(看Spec文件)
p参数用于添加导入库时用于寻找的路径(自己写的文件导入时跟导入库一样,因此多个py文件时需要使用p参数来提供路径
What PyInstaller Does and How It Does It
Analysis步骤时(即spec文件中的Analysis类),会对脚本中的import语句进行递归查找,直到得到一个完整的需要导入的模块列表
Pyinstaller能够解析Egg distribution format,能够从egg文件中导入模块
“Egg” is a single-file importable distribution format for Python-related projects. "
http://peak.telecommunity.com/DevCenter/PythonEggs 暂时不深入研究
Pyinstaller还知道许多主要的python库
有一些情况pyinstaller无法检测出导入了库,比如说使用__import__函数、imp.find_module函数来动态导入,还有运行时修改sys.path变量从而导入新修改的路径下面的模块
解决办法有:命令行处添加文件或添加导入路径,修改spec文件,写hook文件
如果程序依赖固定的文件,可以把这些文件一起打包,可以修改spec文件来实现
如果要在运行时定位被包含文件,需要能够获知它的运行路径
Pyinstaller不会包含操作系统的库(这样就不会那么大了,但是可能出现依赖问题)
默认方式是使用D参数来打包生成,即把依赖跟exe文件都放在dist文件夹下面了,可以直接整个文件夹打包发送给别人,直接运行即可,不用安装(绿色软件)
优势:
debug时方便,可以看到把什么依赖放入文件夹了
还有就是,如果修改代码,只要它导入的是相同的依赖,则可以直接发送更新后的执行文件,不用把依赖也重新发送一次(当然,若是修改了依赖,则必须要把依赖也重新发送)
劣势:对于小白可能一时找不到哪个是执行文件,要是一不小心修改删除了某个文件,也会执行不了
工作原理:由bootloader来模拟python解析器来执行脚本
the single executable is a little slower to start up than the one-folder bundle.
比one-folder bundle慢一点点
工作原理同样是:使用bootloader来模拟python解析器
点击执行时会创建一个临时文件夹(文件夹名称为_MEI+随机数字),bootloader会把可执行文件里面包含的非python代码文件解压出来到临时文件,这会消耗一点时间,因此会比one-folder bundle慢一点点
创建好临时文件夹后,接下来的流程跟one-folder一样,打包的代码执行结束后,bootloader会删除临时文件夹
后面spec文件的内容,这里重复提一下,因为删除临时文件夹时不会把对那些文件的修改写回one-file执行文件里,因此对一起打包进one-file执行文件的那些文件的修改会在程序执行结束时都丢失!!!而one-folder执行文件不会有这个问题
因为每次执行时,临时文件夹名字都有一个不同的随机数字,因此可以同时运行多个app,不会互相干扰
如果程序进程中途被杀死,临时文件夹不会被删除,因此多次以后可能会浪费很多空间
如下,已经有几个了。。。
可以使用参数–runtime-tmpdir来指定临时文件夹的位置,这个参数会存储进可执行文件