Compilation facile de Python avec NUITKA-Utilities

J'en ai trouvé un bon

NUITKA-Utilities

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

exe-maker.jpg

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

Le standalone de Nuitka a beaucoup de DLL

Spécifiez simplement le dossier .dist compilé et il créera un seul fichier exe. (Onefile-maker-windows.py)

onefile.png

Installez NSIS à l'avance sur Windows.

https://nsis.sourceforge.io/Download

Je veux réduire la taille

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é avec PyInstaller

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.

prime

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

Compilation facile de Python avec NUITKA-Utilities
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Compilation Python avec pyqt deploy
Serveur HTTP facile avec Python
[Python] Traitement parallèle facile avec Joblib
Programmation facile Python + OpenCV avec Canopy
Transmission de courrier facile avec Hâte Python3
Visualisez facilement vos données avec Python seaborn.
Exécution parallèle facile avec le sous-processus python
FizzBuzz en Python3
Extraction de mots-clés facile avec TermExtract pour Python
Grattage avec Python
[Python] Test super facile avec instruction assert
[Python] Vérification simple du type d'argument avec la classe de données
Python est facile
Statistiques avec python
Grattage avec Python
Python avec Go
Intégrer avec Python
Introduction facile de la reconnaissance vocale avec Python
AES256 avec python
Testé avec Python
python commence par ()
[Easy Python] Lecture de fichiers Excel avec openpyxl
avec syntaxe (Python)
Application Web facile avec Python + Flask + Heroku
Bingo avec python
Zundokokiyoshi avec python
Traitez facilement des images en Python avec Pillow
[Easy Python] Lecture de fichiers Excel avec des pandas
Scraping Web facile avec Python et Ruby
[Python] Essayez facilement l'apprentissage amélioré (DQN) avec Keras-RL
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Sortie CSV de la recherche Google avec [Python]! 【Facile】
Analyse de régression LASSO facile avec Python (pas de théorie)
✨ Facile avec Python ☆ Temps écoulé estimé après la mort ✨
Communication série avec Python
Zip, décompressez avec python
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Easy Grad-CAM avec pytorch-gradcam
Grattage en Python (préparation)
Essayez de gratter avec Python.
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
Collecter des tweets avec Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python