那天赶着把写好的小脚本发给同事,不想让他再装一遍python环境,才开始琢磨python怎么打包成exe,之前只在网上扫过几眼,没真动手跑过。打开cmd先敲pip装pyinstaller,进度条慢慢走完的时候还挺轻松,以为接下来一行命令就能完事。

直接复制别人贴出来的基础命令,把脚本名字填进去,回车之后屏幕哗啦啦滚出来一堆日志,等它停下,去dist文件夹里面找生成的程序。双击点开,倒是能正常跑,没有直接闪退,心里松了一口气,可右键看属性的时候愣了一下,一个才两百多行的简易脚本,打包出来居然快两百兆。

当时没想明白哪里出问题,反复打包了两次,每次大小都差不多,甚至换了个干净的虚拟环境再装包打包,体积还是没降多少。旁边朋友说他打包同类型的脚本只有几十兆,问我是不是环境里面杂七杂八的库装太多了,翻了一遍列表,确实,之前学别的东西顺手装了好多压根这个脚本用不上的依赖。

删不掉已经装在环境里的库,又懒得一个个卸载,干脆新建了一个全新虚拟环境,只装脚本真正import到的那几个包。再执行打包命令,等待的时间短了一点,文件体积缩下去不少,但依旧达不到他说的那种小巧程度,打开运行的时候,启动也慢,要等个两三秒才会跳出窗口。

试过加上-w参数,把黑色的控制台窗口隐藏掉,打包完双击,程序悄无声息的,出错的时候一点提示都没有,好几次改完代码重新打包,点开没反应,半天找不到问题在哪,后来又把这个参数去掉,留着黑框,至少报错信息能看见。

有一次还踩了资源文件的坑,脚本里面要读取一个本地txt配置,直接打包之后,exe一打开就报错找不到文件。查了一会才晓得,静态文件不能随便放着,打包的时候要额外指定路径,要么把文件跟着命令一起带上,要么写代码的时候做路径判断,区分开发状态和打包之后的状态。那段来回调试的时间,比写脚本本身还要久。

打包的过程里,电脑风扇一直在转,占用也高,有时候中途莫名中断,日志里蹦出来一堆看不懂的告警,也不是每次都能复现,关掉cmd重新打开再跑一遍,又能顺利走完。同一个脚本,在台式机打包出来的exe,放到另一台笔记本上,偶尔会跑不起来,好像和系统组件也有关系。

折腾到后面,也没继续死磕压缩体积,反正同事那边只是临时用一次,大一点就大一点,传文件慢一点而已。把生成好的exe连同配套的配置文件一起发过去,他点开能用,这件事就算了结了。

这只是我自己折腾的时候遇到的状况,每个人写的脚本、依赖库、系统环境都不一样,体验会差很多。到现在我也没有摸到一个能稳定打出很小文件的办法,之后再有打包需求,大概率还是会用pyinstaller,只是提前新建干净环境,避开那些没必要的麻烦。