NUITKA-Utilities
https://github.com/Nuitka/NUITKA-Utilities
Wenn Sie die PY-Datei und den Ausgabeordner angeben, kompiliert Nuitka sie für Sie. (exe-maker.py)
Installieren Sie unter Windows Mingw-w64 und PySimpleGUI im Voraus.
conda install m2w64-gcc libpython
pip install nuitka
pip install pysimplegui
Geben Sie einfach den kompilierten .dist-Ordner an und es wird eine einzelne exe-Datei erstellt. (Onefile-maker-windows.py)
Installieren Sie NSIS im Voraus unter Windows.
https://nsis.sourceforge.io/Download
Verwenden Sie die Andeutungskompilierung. (Es wird ab Ende 2019 nicht mehr funktionieren.)
https://github.com/Nuitka/NUITKA-Utilities/tree/master/hinted-compilation
Wenn Sie get-hints.py ausführen, werden nur die benötigten Bibliotheken abgerufen. Die Größe und Kompilierungszeit werden kürzer sein.
Ich habe es mit einem handgemachten Python-Skript mit einer GUI von etwa 60 Zeilen verglichen.
test.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.13.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
import time
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(300, 200)
MainWindow.setMaximumSize(QtCore.QSize(300, 200))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(100, 130, 75, 23))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(100, 50, 50, 12))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Start"))
self.label.setText(_translate("MainWindow", "Time:"))
self.pushButton.pressed.connect(calc)
def calc():
start = time.time()
i = 10000000
while i >= 0:
i = i - 1
stop = time.time()
ui.label.setText(str(stop - start))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
PyInstaller | NUITKA(-Utilities) | |
---|---|---|
Einzelne exe Größe | 34.8MB | 17.1MB |
Ausführungsergebnis | 0.8277249s | 0.7182800s |
Anlaufen | Etwas langsam | langsam |
Es ist schade, dass es eine Weile dauert, bis es anfängt, aber die Größe ist halb so hoch. Da es sich um eine kompilierte Binärdatei handelt, ist die Ausführungsgeschwindigkeit etwas hoch. Das Kompilieren dauerte 55 Sekunden und das Erstellen einer einzelnen Exe auf meinem PC 43 Sekunden. pyinstaller hat in ca. 20 Sekunden eine einzelne Exe erstellt.
Wenn ich nuitka über die Befehlszeile ausführe, frage ich mich, wie ich Optionen hinzufügen kann.
Wenn Sie zunächst alle Bibliotheken entfernen, die erstellte ausführbare Datei kompilieren und ausführen, wird Ihnen mitgeteilt, dass die Bibliothek nicht ausreicht. Wenn Sie sie also entsprechend hinzufügen, wird sie eines Tages abgeschlossen.
python -m nuitka hoge.py --standalone --recurse-none --remove-output
Da hoge.exe in hode.dist erstellt wird, führen Sie es in der Befehlszeile aus.
Abhängig vom zurückgegebenen Fehler ist das Hinzufügen von Optionen unterschiedlich.
Fügen Sie zum Zeitpunkt der Warnung --plugin-enable = und --recurse-to = hinzu. Qt und Numpy sind von diesem Typ. --plugin-enable=qt-plugins --recurse-to=PyQt5 --plugin-enable=numpy --recurse-to=numpy
Fügen Sie bei ModuleNotFoundError nur --recurse-to = hinzu. Pyserial und OpenCV sind dieser Typ. --recurse-to=serial --recurse-to=cv2
Wenn Sie es problemlos starten können, können Sie die Verteilungsgröße reduzieren, indem Sie unnötige DLLs überprüfen und löschen. Wenn beispielsweise Qt für die GUI-Bibliothek verwendet wird, können die DLLs Tcl und Tk gelöscht werden. Wenn Sie das Netzwerk nicht verwenden, können Sie die SSL- und Socket-DLLs löschen.
Recommended Posts