目录

EmbedPython | 一种py打包方式

一切的起因

我最近在用 Pyside6 写一个类似视频播放器的项目,期间装了很多相关依赖。功能实现后想把程序发给别人时却遇到了难题,如果只是简单用 zip 或 rar 打包的话在对方主机上解压程序会因为缺乏相关依赖而无法运行。这就比较令人头疼了。

我最初的想法是将程序以及环境打包成 docker 镜像进行分发,但是最后因为两点原因放弃了,其一是这样打包出来的 docker 镜像可能较大,其二是我本地的开发环境是 windows 系统,虽然可以使用 WSL2 ,但是感觉使用起来会比较麻烦,甚至还要手动编写 dockerfile 。

再这之后我又上网寻找了一些 python 打包方案,或是不令人满意,或是与我的诉求不符。

最终几番轮回下我还是选择了在知乎上看到的一篇 利用Python embed方法打包的文章 ,整体看上去感觉上手难度不大,并且文章发布日期也不是很久远,所以立马动手进行操作。

踩坑的经过

我首先是按照教程进行操作,解压安装打包一气呵成。但是结果无法运行。

由于教程的后几步我不太理解是怎么回事,尤其是最后 download.png 部分让我完全摸不着头脑。看到寥寥几行的 bat ,我首先以为是 bat 文件中缺少了相关代码。后来在 chenx 大佬的指点下发现其实只要这两行代码就已经够了。

由于没了解问题所在,我试着按教程再重新走一遍,但是在这一遍的过程中,我忘记将 ._pth 文件删除了,所以运行时报了找不到对应依赖的 error 。在这一过程中我在 chenx 大佬的帮助下将 ._pth 文件中最下面一行注释取消了,如此一来便建立了外部链接与 python 文件之间的联系。

然而,运行结果仍然是找不到外部包,不过这一次报错的包不在是 Pyside6 ,说明大部分包还是没啥问题的。

这期间我检查了 requirements.txt ,结果发现通过 pipreqs 生成的 txt 文件内容不但不全,版本还和实际存在诸多偏差。于是我手动修改了相关包的描述,重新运行 bat 脚本。

结果这次的报错令人大跌眼镜,外部链接都全部找到了,但是我自己编写的内部链接却找不到,检查 ._pth 文件中的内容也发现当前目录 . 已经包含在 path 中了,怎么会找不到呢?这让我有些迷茫,不知所措。

但是,在我即将放弃折腾的时候,我突然意识到之前教程作者是让我们删除 ._pth 文件,而不是对它进行修改,所以我立刻执行了删除操作,并重新双击 bat 脚本。

这一次,程序完美的运行了。