写点什么

Python 程序打包

作者:ITCamel
  • 2022-12-03
    山东
  • 本文字数:1433 字

    阅读完需:约 5 分钟

Python 社区文化崇尚开源,复用,所以 Python 程序多以包的形式发布在 PyPI 这样的包管理网站上,而使用者默认已经具备了 Python 的运行环境,这时只需要使用 pip 这类的工具,直接下载安装即可使用。


作为一个公司或者个人开发者,我们不能指望我们的目标用户环境已经安装了 Python 环境,更进一步,我们并不想我们写的代码被其他人看到。在这种情况下我们就有了两个核心诉求。


  1. Python 程序可以打包成像 window 中的 exe 这样的独立运行的程序。

  2. 程序可以加密或者编译成二进制码,而不是 pyc 这样的字节码,以防止被轻松反译出原码。

打包成 exe 程序

目前打包成 exe 可执行文件,比较成熟的方案包括 py2exe 和 cx_freeze。这两种方案的操作基本大同小异,写好 setup.py,然后执行即可。官方文档比较详细,也可以在网络上轻松找到其他参考资料,在此不再细说。这种情况下,我们可以把程序运行信赖的 Python 环境和各个 package 都打包成一份,这个时候,我们就可以将打包出来的包复制到其他的电脑直接运行了,与其他的程序并没有什么区别。


当然,这样打包出来的文件,除了依赖库原生是 dll 的,会被加载进来,其他的 python 代码,则会被编译成 pyc 文件打包成 lib 添加到我们的目录当中。我们都知道 pyc 文件是可以被简单还原成源码的,并不存在什么技术门槛,要想将代码编译生成 dll 或者 exe,我们还需要其他办法。

编译成二进制文件

Python 的一般的执行过程,是 python 解释器将 pyc 文件中的指令,即字节码转换成操作系统的机器码,然后再进行执行。我们想将源码编译成二进制码,这就跳过了解释器的将字节码转换成机器码的过程,这并没有省略多少时间,但客观上完成了源码的加密。那么,我们就来介绍一下 Cython。


Cython 是 python 的超集,也就是说,你写的 python 代码将完全可以被 Cython 接受,更重要的是,你还可以写一些类型确定的代码,暂时抛下动态的语言属性,在某些模块出,写出比拟 C 语言速度的代码。当然,这不是我们当前关注的重点,我们只知道,通过 Cython 我们可以将源码编译成 pyd 文件就可以了。


所以,对于重点代码,或者你想保护的代码,将其通过 cython 编译成 pyd,然后以模块的形式来加以调用就是可行的方案了。什么?你想保护所有代码?!不管你的代码是不是那么值钱,我们还有另外一个解决方案。


王炸登场,Nuitka!这个软件可以帮我们轻松实现,我们想将哪些源码进行打包,甚至允许我们将所有的内容将整合到一个可执行文件当中,用法也是极其简单的,在这里也做说明,直接访问官网即可。

爬坑

写程序这件事,如果太顺利,总感觉不真实,所以,有坑才是常态。我的项目使用 PyQt5+twisted 作为框架,在打包后,发现程序登录后直接就卡死了,界面也没有正确显示,而且在日志中也没有发现什么异常。再回头查资料,从官网的说明中,发现其对 PyQt5 的支持并不全面,而对 PyQt6 就信心满满了。所以,我了一天时间将工程从 PyQt5 升级到了 PyQt6, 一通的代码修改,顺便让我了解了一下 PyQt5 与 PyQt6 的不同之处。但问题并没有消失,于是继续定位,最终发现是 QThread 的原因!而另一篇帖子则无意中提到了 PySide6,我顺便就抱着试试看的心情将使用的包从 PyQt6 转换成了 PySide6,问题解决!


  • PySide6 是 Qt 的母公司自己推出的产品,属于亲儿子,而且在商业使用中不受限制。

  • PyQt6 是第三方公司在市场推出的一个产品,如果要商用,应该是要收费的,或者商用的产品也必须进行开源。


前后折腾了三天的时间,以上就是自己的所得。之所以没有将代码或者命令行细节贴在这里,是因为不同的人的需求并不完全一致,而官方网站也有更详细的说明,还是直接去官方参考最佳。


发布于: 刚刚阅读数: 5
用户头像

ITCamel

关注

努力生活,快乐编程 2020-08-06 加入

一个在3D软件行业的程序员和创业者

评论

发布
暂无评论
Python程序打包_PyQt5_ITCamel_InfoQ写作社区