首页 / 资讯中心 / 文章详情

别人用Python写的exe工具又小又快,我打包的却几百兆,差距就在这

别人用Python写的exe工具又小又快,我打包的却几百兆,差距就在这 ★ FEATURED ARTICLE
初入行业之际, 我亦碰到过此令人头疼不已的状况。项目已然撰写完成, 功能也已顺利运转, 满心欢喜地着手进行打包。一开启文件夹, 嚯, 竟有三百多兆。将其发给他人使用, 对方的第一反应便是“你所编写的这个啥软件呀, 居然比整个游戏还要大”。那般尴尬之情, 从事开发工作的人皆能体会。之后, 我长时间盯着他人所创作的小工具瞧, 同样是进行编写, 人家的exe也就十几兆, 甚至有达到几兆的, 那差距究竟处于何处呢? 我耗费了一个周末不断进行测试, 将所遭遇的问题挫折以及摸索探寻出的经验记录下来。这些方法并无高深难测的理论, 全都是能够马上着手去做马上就能上手的, 用于编写小工具的方法, 用于缩小与他人小工具差距的方法, 用于提高小工具编写效率的方法。首步要弄明白打包之际哪些物品是切实所需的, 好多人一开始就采用默认参数进行打包, 默认模式会将整个解释器以及一堆标准库都装填进去, 你明明仅仅使用了一个库, 它却把诸如 xml、email 这些毫无关联的模块全都一并带上了, 打开生成的 warn 文件瞧一瞧便晓得有多浪费, 运用 --- 参数能够指定不需要的模块, 譬如 --- --- email.py , 逐一条目添加, 能削减不少体积。使用虚拟环境能够省下远超一半的体积, 不少人在开发机上安置了几十单个的包组, 于打包之际会对整个site-目录予以扫描, 将能够与之关联的全部纳入打包范围, 即便在代码当中仅仅使用了三个包, 它也极有可能把相关的依赖一并引入, 恰当的做法是构建一个纯净的虚拟环境, 仅仅借助pip来安装必需的包, 于这个环境里实施打包操作, 所生成的exe文件会小上许多, 我曾有过一次尝试, 直接从二百多兆缩减至五十兆以内。选对那种打包模式也是特别关键的, 默认的那种模式会将所有的文件解压到某一个临时目录之后再去运行。 这样看上去好像挺方便的, 实际上额外的情况就是会多出临时文件所占据的空间情形。 如果用户对于文件夹形式毫不在意这件事, 使用这种指定的模式便能够省掉压缩过程和解压有关的诸多开销情况。 使用这种模式打包起来之后的目录看上去文件相当多, 不过总的大小一般而言会比另一种小百分之二十至三十的样子。 并且启动的速度相对更快一些, 原因则是不需要先进行解压操作。还有个地方容易被忽略, 那就是资源文件, 不少人会在代码里把图片、字体、数据文件的路径写死, 打包时将这些资源全放进去, 实际上有些图片能换成矢量格式, 或者直接在代码里采用编码, 小图标采用PNG格式, 能压缩到几KB, 字体文件规模更大, 中文字体动不动就十几兆, 可以运用字体子集化工具, 仅保留用到的几个汉字, 能缩减到几十KB, 我曾见过极为极端的情形, 为一个日志分析工具, 因嵌入了完整的楷体字体包, 体积急剧暴涨了三十兆。使用UPX压缩壳可使exe体积缩减至一半, UPX是免费工具, 可对exe进行压缩, 本身支持集成UPX, 将upx.exe置于系统路径, 打包时添加 --upx-dir 参数即可, UPX压缩对纯逻辑代码效果优良, 但若exe已含大量压缩图片或二进制数据, 压缩效果会降低, 不过多数工具类代码, 用UPX能节省百分之四十到五十的体积。关于处理第三方库, 还有一点经验。有些库的导入方式, 会致使错误地打包大量无关文件, 比如库, 若你仅用到读写Excel的功能, 它会将整个内置的图表引擎、图像处理模块都带入。此时, 可用hook文件手动指定哪些模块不被打包。在项目目录下创建一个名为hooks的文件夹, 于其中编写一个名为hook-.py的文件, 来告知排除某些子模块。网上存在现成的hook模板, 拿来修改一下便可使用。打包弄好之后, 要记着把生成的exe拖进PE文件专用分析工具当中瞧一番所依赖的DLL。存在一些DLL是由系统自身携带的, 压根儿不用进行打包。偶尔状况下会错误地把系统自带的那个DLL也给复制进来。依靠手动模式将这些多于的DLL给删掉, 进而能够省下好几兆哦。条件在于此DLL在目标用户所使用的系统里确实是存在的。市面上10以上版本的那些常见系统DLL基本上都是有保障的。最末一步是针对exe运用7z极限压缩, 此操作不会对运行造成影响, 纯粹是图分发便利, 有些压缩软件针对exe的压缩率颇高, 一个五十兆的exe, 采用7z极限模式能够压缩至十几兆, 在发给他人之际, 打包成自解压单文件, 看上去依旧是单个exe, 然而体积却小了许多用户双击自解压文件, 它会自行解压至临时目录而后运行, 虽说启动慢了半秒, 可是下载速度增速了十倍。这些办法都是我亲自尝试出来的, 实现了由三百兆降至三十兆, 绝非虚言。倘若你想上手练习, 可以先选用一个小型工具, 将打包流程熟练掌握。每一个环节上节省些许, 总体成效便显著可观。最为重要的在于心态要严谨持正, 打包并非最后一步就可以随心所欲敷衍了事。如同编写代码一般, 它同样值得郑重对待。
阅读完成 · 觉得有帮助?
咨询建站