Python 3.x + PyQt5 + py2exe/pyinstaller/cx-Freeze

Tar*_*cco 5 py2exe pyinstaller cx-freeze python-3.x pyqt5

我一直在探索如何冻结使用Flask-desktop 的包的选项。Qt 完成了很多繁重的工作,因此它是一个相当大的库。

我尝试了几种选择,看看我能做什么。此处的 Python 版本表明对每个包的明确支持。

|                 |Python 3.4|Python 3.5|Python 3.6|Runs*  |Works**|
|-----------------|----------|----------|----------|-------|-------|
|PyQt4            |Yes       |Yes       |Yes       |?      |?      |
|PyQt5 (5.8.2)    |No        |Yes       |Yes       |Yes    |Yes    |
|cx-Freeze (5.0.1)|Yes       |Yes       |Yes       |Yes    |Yes    |
|py2exe (0.9.2.2) |Yes       |No        |No        |Yes    |No     |
|pyinstaller***   |Yes       |Yes***    |No        |Yes    |No     |
Run Code Online (Sandbox Code Playgroud)

*命令执行或包导入没有错误

**命令结果有效(即产生工作冻结)

*** 开发分支支持

我尝试分别使用最新版本的 py2exe 和 pyinstaller 与 Python 3.4/3.5/3.6,但没有成功。我每次收到的错误都是不同且复杂的,并且对于每个 Python 版本和任一冷冻机包的配对,我对其进行的调试和研究都是不成功的。我很快就没有足够的时间来深入研究这个问题。

PyQt4 不是一个实用的选择,因为它缺乏一些非常重要的功能,例如 HiDPI 支持,并且它使用已弃用的 QtWebKit。

PyQt5 仅与 Python 3.5 及更高版本兼容,因为它的sip包需要它。

py2exe 支持 UPX 和单文件 (.exe) 输出,但不超过 Python 3.4。

pyinstaller dev 分支在 3.5 中运行,但我无法让它将二进制文件正确复制到输出目录。每次运行它时,我都会收到一条有关无法找到 Qt5 库的错误消息。每次运行的时候都是不同的。

另一方面,cx-Freeze 正在以下方面提供一些指导setup.py

build_options = dict(
    packages = ['encodings', 'asyncio', 'jinja2'],
    ...
)
Run Code Online (Sandbox Code Playgroud)

现在这太棒了。它会产生工作冻结,但我唯一剩下的关心是我应该如何将这个 300MB 的冻结内容文件夹(70 个文件/文件夹!)变成更易于管理的东西(最好在 30MB 以下)?例如,所有(预编译的)Qt5 库都在两个不同的路径中复制到目标两次:build\exe.win-amd64-3.6build\exe.win-amd64-3.6\PyQt5\Qt\bin。我可以删除其中的 DLL build\exe.win-amd64-3.6,程序仍然可以正常运行。依赖项的QtWebEngineCore.dll大小为 65MB(未压缩),在-9最大压缩下通过 UPX 运行后大约为 26MB(这是一个好的开始)。

我的目标是最大限度地减少应用程序的占用空间,目前,我的 Flask-Python 程序非常占用内存:

我的烧瓶桌面程序占用了大量内存

对于使用 QtWebEngine 的基于 (Py)Qt5 的应用程序使用更少的内存,您有什么建议?另外,我不熟悉 cx-Freeze,所以我很想知道是否有人可以建议我如何使用它来减少构建输出大小,或者如何让另一个包冷冻机与 Python 3.5/3.6 和 PyQt5 一起使用。

我觉得我已经在这里探索了很多选项,但由于 Python/包版本不兼容,我仍然遇到困难的限制。任何帮助是极大的赞赏。