Qt for Python & Nuitka¶
Nuitka lets you compile your python application into a stand-alone executable. Besides being a Python compiler which provides a fair acceleration, it has the side-effect of acting as an installer as well. Nuitka supports Linux, macOS and Windows.
For more details, see the official documentation.
Preparation¶
Install Nuitka via pip with the following command:
pip3 install nuitka
After installation, the nuitka3 binary is located in your virtual environment’s bin/ directory, or where your Python executable is located. Alternatively, you can also run:
python3 -m nuitka
to achieve the same effect.
Freeze an application¶
Nuitka has many options that you can use. To list them all, run nuitka3 -h.
To simply compile a project, you can run:
nuitka3 <programname>
There are two main features:
the option to place it in a directory containing the libraries (–standalone)
the option to package the whole project (including shared libraries) into one executable file (–onefile)
If you use these options, you need to specify –plugin-enable=pyside6.
Run an example¶
Now, consider the following script, named 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())
You don’t have to copy this script. You find it as examples/installer_test/hello.py.
The command line to proceed looks like this:
nuitka3 examples/installer_test/hello.py
This process creates an executable hello.bin and a directory hello.build that you don’t need. You can execute the binary directly.
In order to create a bundle which can be copied onto a machine without any pre-existing installation, run:
nuitka3 --standalone --plugin-enable=pyside6 examples/installer_test/hello.py
This creates an application hello.dist/hello that contains everything needed to run.
To run the application, go to hello.dist/ and run the program:
cd hello.dist
./hello
Use the –onefile option if you prefer to have everything bundled into one executable, without the shared libraries next to it. First you need to install:
pip3 install zstandard
for data compression. Then you can run
nuitka3 –onefile –plugin-enable=pyside6 examples/installer_test/hello.py
This process takes a bit longer, but in the end you have one executable hello.bin:
./hello.bin
Some Caveats¶
Nuitka issue on macOS¶
Nuitka currently has a problem with the macOS bundle files on current macOS versions. That has the effect that –standalone and –onefile create a crashing application. Older versions which don’t have the recent macOS API changes from 2020 will work. We are currently trying to fix that problem.
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.