Python打包工具--Pyinstaller详细介绍
那年初相识
Pyinstaller这个库是我用pip下载的第一个模块。为什么?因为第一次接触python的时候,就是看到网上有人用Python编写的工具,可以直接运行在windows机器下。
这种脱离编译环境/虚拟机而单独运行的能力是我一直期待的,有人会问为什么不学c++?
因为,这老哥头发让我有些慌…
然后我上网搜了一下python,当看到python之父那茂密的头发时,更坚定了我学习python的信念。
由于我这人沉不住气,一分钟学习了python安装+print输出,就急着去网上搜索如何打包写好的代码,转化为exe文件…顺着这条主线安装了pip,公司内外网隔离,又千般周折找到了公司自身的镜像源。修改镜像默认配置后完成了pyinstaller的下载后,终于赶在日落西山前将我这一行print代码打包成了exe文件,发给同事炫耀。
现在想想好幼稚…
一发不可收拾
也许就是因为pyinstaller这家伙,导致我的python路线直接跳过基础,从easygui和tkinter开始了…
有exe如果再能配上GUI,那岂不是装13必备。但在没有基础的前提下去学这些东西,可想而只当时有多苦B。
最终慢慢玩腻了,才重新一步步从基础开始学起。
Yesterday Once More
最近项目在做一个集成打包工具,需要在Linux环境下将很多基础环境通过脚本进行自动化的打包、安装、运行。本来是打算通过shell完成了,但由于模块很多,又牵扯大批量的配置文件,所以最终选择了python。但最终客户方要求,执行的脚本可以在一台全新的网络隔离的机器上进行运行。这就苦恼了,因为python虽然配置了requirement,但还是依赖镜像源去下载模块。虽然当时想到了pyinstaller,但可惜使用它在windows环境下使用的,这次是Linux环境。然后上网搜了一圈,最终又回到了pyinstaller…
PyInstaller is a program that converts (packages) Python programs into stand-alone executables, under Windows, Linux, Mac OS X, AIX and Solaris. Its main advantages over similar tools are that PyInstaller works with any version of Python since 2.3, it builds smaller executables thanks to transparent compression, it is fully multi-platform, and uses the OS support to load the dynamic libraries, thus ensuring full compatibility.
突然想起一首萧亚轩的歌“最熟悉的陌生人”(是否暴露了年龄…),很多时候我们对身边自认为熟识的东西,反而遗漏了太多。
重新学习pyinstaller
- 安装
pip install pyinstaller
- 注意
windows下使用它时,需要依赖pywin32模块,好在这个模块从3.3那时的exe安装,已经迁移到了pip,默认安装时,可以安装此依赖。
Linux下使用它时,需要依赖python-devel 。往往python在首次编译时就要添加此依赖。否则后期需要重新编译安装… - 配置
windows下pyinstaller安装完成后,会在{PythonPath}/Scripts下,python2很多版本没有默认将次目录添加至环境变量,需要手动进行添加。
linux下次目录在${PythonPath}/bin下,需要创建链接后进行使用。ln -s {PythonPath}/bin/pyinstlaler /usr/bin
参数 | |
---|---|
-F, –onefile | 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用 |
-D, –onedir | 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护 |
-K, –tk | 在部署时包含 TCL/TK |
-a, –ascii | 不包含编码.在支持Unicode的python版本上默认包含所有的编码. |
-d, –debug | 产生debug版本的可执行文件 |
-w,–windowed,–noconsole | 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效) |
-c,–nowindowed,–console | 使用控制台子系统执行(默认)(只对Windows有效)pyinstaller -c xxxx.pypyinstaller xxxx.py --console |
-s,–strip | 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用. |
-X, –upx | 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note) |
-o DIR, –out=DIR | 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下. |
-p DIR, –path=DIR | 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源 |
–icon=<FILE.ICO> | 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py |
–icon=<FILE.EXE,N> | 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效) |
-v FILE, –version=FILE | 将verfile作为可执行文件的版本资源(只对Windows系统有效) |
-n NAME, –name=NAME | 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字 |
看这参数这么多,其实很简单…
通用参数
- -p
这个参数如说明所示,虽然pyinstaller可以将代码import导入的依赖包进行打包,但有时,我们自己开发的代码,可能会忽视,那就需要我们通过-p 参数手动引入了 - -F
默认pyinstaller打包后,会将依赖文件和执行文件打包成一个文件夹的,如果使用-F参数,则可以将所有依赖打包成一个单独的文件,windows为exe文件,linux 直接 chmod +x filename即可执行…
好了,通用的就这俩
windows下使用的参数
- -w
windows环境下,打包完成我们在执行的时候,会弹出类似cmd的窗口,进行输入输出和交互。但如果你是打包的tkinter这种GUI,那就不需要后台影响美观的黑框了… - -i 为你编译好的exe添加一个ico图标吧…
不建议使用的参数
- -X,-upx
这个参数,看描述很吸引人,可以压缩执行文件,但真的劝大家不要用这个参数,先不说需要安装upx的压缩插件,单单是遇到几次使用此参数后,代码中途异常退出就情况,所以不建议大家使用。
示例
说那么多不如看个图来的方便,我们用pyinstaller打包一个简单的Flask程序,看看能否成功吧:
我们看到使用pyinstaller 打包程序时,会显示生成build将工具依赖的文件放入,然后进行打包操作生成代码文件同名并以spec的配置文件,最终将打包成功的exe保存在dist文件夹内。
大家注意为什么第一次执行的时候提示server error。因为虽然我们将python文件打包了,但是Flask依赖的html模板文件它时不支持打包的,需要我么单独拷贝到对应的文件中,才能执行…
好了,今天的内容就到这里,如果觉得有帮助,记得点赞支持。欢迎大家关注我的公众号【清风Python】,获取更多Python相关的知识,公众号内有整理好的各类福利数据供大家下载,扫码关注: