Qt for Python & Nuitka#

Nuitka 可以将您的 Python 应用程序编译成一个独立的可执行文件。除了作为Python编译器提供公平的加速外,它还具有安装器的副作用。Nuitka 支持 Linux、macOS 和 Windows。

有关更多详细信息,请参阅 官方文档

准备工作#

使用以下命令通过 pip 安装 Nuitka

pip install nuitka

安装后,nuitka3 二进制文件位于您的虚拟环境的 bin/ 目录中,或者您的 Python 可执行文件所在的位置。您还可以运行

python3 -m nuitka

以实现相同的效果。

冻结应用程序#

Nuitka 有很多选项可以使用。要列出所有选项,请运行 nuitka3 -h

要简单地编译项目,请运行

nuitka3 <programname>

有两个主要功能

  • 将库放在包含库的目录中的选项(--standalone

  • 选项将整个项目(包括共享库)打包成一个可执行文件(--onefile

如果使用这些选项,需要指定 --plugin-enable=pyside6

运行示例#

现在,考虑以下脚本,命名为 hello.py

import sys
import random
from PySide6.QtWidgets import (QApplication, QLabel, QPushButton,
                               QVBoxLayout, QWidget)
from PySide6.QtCore import Slot, Qt

class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
            "Hola Mundo", "Привет мир"]

        self.button = QPushButton("Click me!")
        self.text = QLabel("Hello World")
        self.text.setAlignment(Qt.AlignCenter)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

        # Connecting the signal
        self.button.clicked.connect(self.magic)

    @Slot()
    def magic(self):
        self.text.setText(random.choice(self.hello))

if __name__ == "__main__":
    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()

    sys.exit(app.exec())

您不必复制此脚本。您可以在 examples/installer_test/hello.py 找到它。

执行命令行如下所示

nuitka3 examples/installer_test/hello.py

此过程创建了一个可执行文件 hello.bin 和一个不必要的中途目录 hello.build。您可以直接执行该二进制文件。

要创建一个可以复制到没有预先安装的机器上的捆绑包,请运行

nuitka3 --standalone --plugin-enable=pyside6 examples/installer_test/hello.py

这创建了一个包含所有运行所需内容的程序 hello.dist/hello

要运行程序,请转到 hello.dist/ 并运行程序

cd hello.dist
./hello

如果您更愿意将所有内容捆绑到一个可执行文件中,而不是将共享库放在旁边,请使用 --onefile 选项。首先您需要安装

pip install zstandard

以进行数据压缩。然后您可以运行

nuitka3 --onefile --plugin-enable=pyside6 examples/installer_test/hello.py

此过程可能需要一点时间,但最后您将有一个单一的 hello.bin 可执行文件

./hello.bin

一些注意事项#

macOS上的Nuitka问题#

Nuitka 目前在当前 macOS 版本上存在与 macOS 包文件的问题。这导致使用 --standalone--onefile 选项会创建崩溃的应用程序。没有采用 2020 年以来最新 macOS API 变更的旧版本可以正常运行。我们目前正在尝试解决这个问题。