Einfache Python-Kompilierung mit NUITKA-Utilities

Ich habe einen guten gefunden

NUITKA-Utilities

https://github.com/Nuitka/NUITKA-Utilities

exe-maker.jpg

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

Nuitkas Standalone hat viele DLLs

Geben Sie einfach den kompilierten .dist-Ordner an und es wird eine einzelne exe-Datei erstellt. (Onefile-maker-windows.py)

onefile.png

Installieren Sie NSIS im Voraus unter Windows.

https://nsis.sourceforge.io/Download

Ich möchte die Größe reduzieren

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 PyInstaller verglichen

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.

Bonus

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

Einfache Python-Kompilierung mit NUITKA-Utilities
[Analyse des gemeinsamen Auftretens] Einfache Analyse des gemeinsamen Auftretens mit Python! [Python]
Python-Kompilierung mit pyqt deploy
Einfacher HTTP-Server mit Python
[Python] Einfache Parallelverarbeitung mit Joblib
Einfache Python + OpenCV-Programmierung mit Canopy
Einfache Mailübertragung mit Eile Python3
Visualisieren Sie Ihre Daten ganz einfach mit Python Seaborn.
Einfache parallele Ausführung mit Python-Unterprozess
FizzBuzz in Python3
Einfache Schlüsselwortextraktion mit TermExtract für Python
Scraping mit Python
[Python] Super einfacher Test mit Assert-Anweisung
[Python] Einfache Überprüfung des Argumenttyps mit Datenklasse
Python ist einfach
Statistik mit Python
Scraping mit Python
Python mit Go
In Python integrieren
Einfache Einführung der Spracherkennung mit Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
[Easy Python] Lesen von Excel-Dateien mit openpyxl
mit Syntax (Python)
Einfache Web-App mit Python + Flask + Heroku
Bingo mit Python
Zundokokiyoshi mit Python
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
[Easy Python] Lesen von Excel-Dateien mit Pandas
Einfaches Web-Scraping mit Python und Ruby
[Python] Probieren Sie mit Keras-RL ganz einfach erweitertes Lernen (DQN) aus
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
CSV-Ausgabe der Google-Suche mit [Python]! 【Einfach】
Einfache LASSO-Regressionsanalyse mit Python (keine Theorie)
✨ Einfach mit Python ☆ Geschätzte verstrichene Zeit nach dem Tod ✨
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Easy Grad-CAM mit Pytorch-Gradcam
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
Tweets mit Python sammeln
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python