如何将PyQt脚本(.py)编译为单个独立的可执行文件(.exe)以供Windows或Linux使用?

68
我开始尝试使用PyQt,并根据白皮书示例程序(pastebin)制作了一个“漂亮”的脚本。在已经安装有Qt环境的Windows和Linux中,它都可以完美运行。
现在我的问题是:由于我正在尝试使用Qt,因为它是编译的(至少基于纯旧C++的Qt),那么我该如何编译一些.exe文件以在Windows上运行,或者在Linux上创建一个独立的可执行文件。
关键在于我希望将程序编译,因为这样可以提高速度和可移植性,而不是从源代码解释运行,这需要在任何计算机上进行先前的设置。例如,其中一个目标是通过电子邮件向不是程序员的同事发送小型GUI脚本。

我认为https://dev59.com/iHE85IYBdhLWcg3wkkfK可以回答你在Windows上的问题。 - Martijn Pieters
对于 Linux 和 Mac OS X,这里有一个关于 Python 可执行文件的问题:http://stackoverflow.com/questions/4322250/python-executable - Martijn Pieters
你搞定了吗?我这里有一个类似的问题:https://dev59.com/E4Pgs4cB2Jgan1zn-UpT - Duh Compewtuhr
@DuhCompewtuhr 很抱歉,我没有尝试过其他的项目,每当我需要一些简单的GUI时,我仍然使用PyGtk。 - heltonbiker
可能是如何在Python中制作可执行文件?的重复问题。 - Jean-François Corbett
6个回答

70
如果您想要完全创建一个独立的可执行文件,可以尝试使用PyInstaller。根据我的经验,我觉得它比cx_freeze或py2exe更好,并且容易使用(网站上提供了完整的文档)。它支持Python 3.6或更新版本。如果您想创建完全独立的.exe文件,请传递--onefile参数,例如:
pyinstaller.exe --onefile --windowed app.py

8
嗨,好消息!现在支持Python 3.3-3.5。 - Ari
为什么不更新答案以提到支持Python 3呢?并不是每个人都会看评论 :) - Mohamed Taher Alrefaie
1
我看到pyinstaller现在也支持Python 3.6了:多版本:支持Python 2.7和Python 3.3-3.6。 - user3078690
@YudaPrawira:在没有安装PyQt的机器上运行由pyinstaller制作的可执行文件是否可能?我正在尝试部署一个PyQt5应用程序,但遇到了问题... - A.J
@Abin 请在此处查看 https://pythonhosted.org/PyInstaller/when-things-go-wrong.html#listing-hidden-imports 我认为你可以使用 --hidden-import 命令选项。值得一试。 - Yuda Prawira

25

在尝试了许多选择(如PyInstaller、py2exe、cx_freeze等)并花费数周的时间后,我创建了自己的库:https://build-system.fman.io/。它基于PyInstaller,但解决了其常见问题,并允许您在Windows、Mac和Linux上创建本机安装程序。


先生,您确认支持哪些版本的Python和PyQt吗? - Voldemort
目前仅支持Python 3.5和3.6版本。 - Michael Herrmann
4
请注意许可证: 许可证 您可以在遵循“GPL”许可下的开源项目中免费使用 fbs。如果您不想将代码公开,每位开发者可以购买商业许可证,价格为 449 欧元。 - user10838321
EUR 49 是最便宜的商业许可证价格。 - Michael Herrmann

4
你可能想要查看cx_freeze。它声称可以创建“跨平台的可执行文件,应该可以在Python本身支持的任何平台上运行”。
我在探索使用PyQt的moneyGuru软件包时发现了它。我将moneyguru.exe文件下载到我的Windows XP系统中,执行它,在Python 3.2上正常运行。
你可以从这里克隆hg仓库以查看它是如何实现的。

O'Donnel说:“moneyguru.exe文件(…)在Python 3.2上运行良好。”唐,我不明白这个。你在Python上运行了一个.exe文件?你使用cx_freeze编译py源代码来获取.exe文件吗?还是其他什么方法?谢谢! - heltonbiker
@heltonbiker:对于混淆感到抱歉。下载文件名为 moneyGuru_win_2_3_7.exe。当您执行该文件时,它会在 C:\Program Files 中创建一个名为 Hardcoded Software 的目录,其中包含(除其他外)启动 Python 应用程序的 moneyGuru.exe 文件。 - Don O'Donnell
@heltonbiker:我还没有尝试安装Linux或Mac版本,但我预计它们的操作方式类似。 - Don O'Donnell
1
这个回答中的所有链接似乎都已失效,降低了它作为问题答案的有效性。 - moken

0

有一个名为 Py2EXE 的模块,可以完全实现你想要的功能。它可以将脚本转换为 .exe 文件,在 Windows 上运行。我不确定 Linux 是否有相应的模块,但我敢打赌在某个地方一定有。

py2exe.com

我知道这个模块,但我不确定它是否等同于使用本地Qt创建相同的应用程序并进行编译。如果我的想法不合理,那就对不起了。我将尝试使用py2exe编译脚本,并在此处发布结果。暂时谢谢! - heltonbiker

0

我正在使用pyinstaller

pip install pyinstaller

我不知道,但是pyinstaller没有附加sip.pyd。所以,你需要一个PyQt5\sip.pyd。我推荐使用漂亮的Windows风格qwindowvistastyle.dll

制作build.cmd文件如下:

pyinstaller --onefile --clean ^
    --add-binary="C:\Users\Quazer\.virtualenv\pyqt5-36\Lib\site-packages\PyQt5\sip.pyd;PyQt5" ^
    --add-binary="C:\Users\Quazer\.virtualenv\pyqt5-36\Lib\site-packages\PyQt5\Qt\plugins\styles\qwindowsvistastyle.dll;PyQt5\Qt\plugins\styles" ^
    .\main.py

^ - 在命令文件(.cmd、.bat)中表示换行


看起来他们修复了这个问题。只需要运行 pyinstaller.exe --onefile --clean .\app.py 就可以了。谢谢。 - msalihbindak

-4
由于我正在尝试使用Qt,因为它是编译过的,但你使用Python将使这种好处作废。尽管其他答案介绍了在不要求用户自己安装Python的情况下分发Python代码的选项,但Python旨在成为一种解释性语言,因此每个选项都有缺点(例如速度、程序大小、兼容性等),这些可能对您来说是优缺点。它们可能是你无法承受的问题,也可能不是。

你的另外两个选择是:

  1. 接受Python的解释性质:让你与之共享程序的人安装Python和依赖项。你可以简化这个过程。例如,在Linux上,使用包管理器。
  2. 用C++编写程序。这样做将允许你真正编译一个单独的本地可执行文件。不幸的是,这意味着放弃Python,但有理由人们仍然用像C++这样不太美丽的语言编写代码,而且听起来你可能正在遇到其中一些问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接