NUITKA-Utilities
https://github.com/Nuitka/NUITKA-Utilities
Si vous spécifiez le fichier .py et le dossier de sortie, Nuitka le compilera pour vous. (exe-maker.py)
Pour Windows, installez Mingw-w64 et PySimpleGUI à l'avance.
conda install m2w64-gcc libpython
pip install nuitka
pip install pysimplegui
Spécifiez simplement le dossier .dist compilé et il créera un seul fichier exe. (Onefile-maker-windows.py)
Installez NSIS à l'avance sur Windows.
https://nsis.sourceforge.io/Download
Utilisez la compilation hinted. (Cela ne fonctionnera pas à partir de fin 2019)
https://github.com/Nuitka/NUITKA-Utilities/tree/master/hinted-compilation
Lorsque vous exécutez get-hints.py, il ne récupère que les bibliothèques dont vous avez besoin. La taille et le temps de compilation seront plus courts.
Je l'ai comparé à un script python fait à la main avec une interface graphique d'environ 60 lignes.
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) | |
---|---|---|
Taille unique exe | 34.8MB | 17.1MB |
Résultat d'exécution | 0.8277249s | 0.7182800s |
Commencez | Légèrement lent | lent |
C'est dommage que cela prenne du temps pour commencer, mais la taille est de moitié. Puisqu'il s'agit d'un binaire compilé, la vitesse d'exécution est un peu rapide. Il a fallu 55 secondes pour compiler et 43 secondes pour créer un seul exe sur mon PC. pyinstaller a créé un seul exe en environ 20 secondes.
Quand je lance nuitka depuis la ligne de commande, je me demande comment ajouter des options.
Premièrement, si vous supprimez toutes les bibliothèques, compilez et exécutez le fichier exécutable créé, vous serez grondé que la bibliothèque est insuffisante, donc si vous l'ajoutez comme il convient, elle sera terminée un jour.
python -m nuitka hoge.py --standalone --recurse-none --remove-output
Puisque hoge.exe est créé dans hode.dist, exécutez-le sur la ligne de commande.
En fonction de l'erreur renvoyée, la manière d'ajouter des options est différente.
Au moment de l'avertissement, ajoutez --plugin-enable = et --recurse-to =. Qt et numpy sont de ce type. --plugin-enable=qt-plugins --recurse-to=PyQt5 --plugin-enable=numpy --recurse-to=numpy
Lorsque ModuleNotFoundError, ajoutez uniquement --recurse-to =. Pyserial et OpenCV sont de ce type. --recurse-to=serial --recurse-to=cv2
Si vous pouvez le démarrer heureusement, vous pouvez réduire la taille de la distribution en vérifiant et en supprimant les DLL inutiles. Par exemple, si Qt est utilisé pour la bibliothèque GUI, les DLL Tcl et Tk peuvent être supprimées. Si vous n'utilisez pas le réseau, vous pouvez supprimer les DLL SSL et socket.
Recommended Posts