Pyinstaller是python文件打包成可执行文件exe最常用的工具之一。一般情况下,使用十分方便。

pyinstaller -F xx.py 即可完成xx文件的打包。只是在实际使用中,根据不同的项目依赖和需求,会有一些不同的操作。

1、常用打包参数

pyinstaller常用打包参数
参数解释
-D, --onedir打包成一个文件夹
-F, --onefile打包成一个可执行文件(exe)
-n NAME, --name NAME指定打包后文件的名字,默认主py文件的名字
--add-data添加其他依赖资源
-w, --windowed针对windows和MacOS,运行时不出现console窗口
-i指定图标文件

要获得所有参数及解释,运行pyinstaller -h

-D 打包成一个文件夹,其效果和你安装的一般软件差不多。包含一个入口文件xx.exe和一系列依赖。

                                    

                       打包成一个文件夹                                          打包成一个文件

 -F 就是整体打包成一个文件,也就是说,你得到的就是一个xx.exe。这两种方式比较直观的差异就是:打包成文件夹,其所占内存空间会更大,但执行速度会稍快一点。

-n 就是给你打包后的文件或文件夹取名字,默认就是py文件的名字xx。这个感觉不重要,你完全可以打包完后重命名。

-w 就是运行时,不会出现控制台窗口。好处就是不会显得很low(双击弹出一个黑框),缺点就是你的一些print打印和报错信息无法查看。(也不是绝对的,可以单独开启一个窗口,然后去运行exe,这样总会出现窗口)

-i 是指定xx.exe的图标文件,不指定时会有默认图标。

--add-data 指定其他依赖资源。打包,实际上就是编译,所有的python代码都会被处理,包括import语句。但如果你的项目包含一些非py文件或py文件并不是通过import引入,那这些文件将会被忽略。此时,就可以通过这个参数指定。

这个情况将在下文更详细展开

2、flask+pyecharts项目使用pyinstaller打包

这个组合并不是说有多常见,而是足够有代表性。可能会遇到的问题如下

比如,在创建app之前,我需要导入配置文件,语句是这样的

app = Flask(__name__)
# 加载配置文件
app.config.from_object('app.setting')

这个setting.py文件并不是通过import语句导入的,因此如果直接打包,运行会提示找不到这个文件。而对于pyecharts或者说你的项目依赖的很多前端的模板、脚本、样式等文件。这些文件也会被pyinstaller忽略。直接打包运行同样会报错。

在我无数次打包失败的基础上,我将这个类型的项目如何打包含泪总结如下:

          项目的整体结构

(1)不要使用conda创建的虚拟环境,直接使用原生python。(我也尝试过使用"python -m venv name"语句创建的虚拟环境,可行)

(2)安装好需要的依赖,pip install aa,bb

(3)选择打包成一个文件夹,方便后面补充依赖,pyinstaller -D xx.py -i abc.ico

 (4)原app目录里的py文件(配置文件除外)都已被打包,但却没有app这个文件夹。手动创建,并根据原项目的结构,补充前端文件和配置文件。其他需要的文件夹类似。(通过时间也可以看出,app和data等文件夹是后创建的)

  app文件夹内添加

 (5)此时,如果你运行程序,发现仍会提示找不到某某文件。别着急,缺什么补什么。针对这个项目,会缺少pymysql(没有导入语句),pyecharts,numpy的部分文件(直接全部替换)。将python环境中site-packages文件夹下相应的依赖包拷贝到项目打包后的文件夹里即可。

    补充文件夹 

至此,这个项目的打包已完成。因为不是专业搞网站开发,都是遇到问题解决问题。我想,对于这样的项目打包,可能是有更好的方案,希望大佬多多指教。

3、64位和32位

虽然现在早已全民小康了,但免不了一些老项目可能使用32位系统。那么如果打包的计算机是64位的,这个exe就是64位的,也就无法在32位系统上运行。解决办法就是安装32位的python,然后安装相应的依赖,最后执行打包。其他没什么区别。

关于安装32位python,有两种方法。

其一是官网下载32位安装包

其二是使用conda

set CONDA_FORCE_32BIT=1 //切换到32位
conda create --name python_test python=3.6 //创建一个python3.6的环境,命名为python_test

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐