Ni pyinstaller ni nuitka ne sont un peu insatisfaisants en essayant de distribuer des programmes Python en binaire. Qt peut créer des binaires sur une plate-forme multiplateforme, et pyqtdeploy semble également être en mesure de créer des binaires en Python. Je l'ai donc commencé directement, mais étonnamment, il n'y a pas d'article en japonais, alors je l'ai écrit.
pyqtdeploy https://www.riverbankcomputing.com/software/pyqtdeploy/intro
https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/demo.html
Environ 10 Go de disque libre Visual Studio Community Edition 2017 Perl (ActivePerl, StrawberryPerl, etc., mis dans PATH) Python2.7 (requis pour construire Qt: version du programme d'installation, pas anaconda / miniconda) Python3.7 (pour la cible: version du programme d'installation, pas anaconda / miniconda)
Mettez pyqt5 et pyqtdeploy avec pip de Python3.
Étant donné que le nombre de caractères PATH dépasse 255 dans la version Qt, rendez-le compatible avec les noms de fichiers longs à l'avance en modifiant le registre. https://orebibou.com/2017/05/windows-10-insider-preview%E3%81%A7explorer%E3%81%A7260%E6%96%87%E5%AD%97%E4%BB%A5% Voir E4% B8% 8A% E3% 81% AEpath% E3% 82% 92% E5% 8F% 96% E3% 82% 8A% E6% 89% B1% E3% 81% 86 /
Récupérez les sources telles que Qt et Python et placez-les dans le dossier demo de la source de déploiement pyqt. La source requise est dans sysroot.json. (OpenSSL, Python, PyQt5, zlib, qt-partout, etc.)
--MSV 2015/2017 introuvable Exécutez la commande de génération à partir de l'invite de commandes de Visual Studio. Construire sur 64 bits: invite de commande des outils natifs x64 pour VS20xx Construire sur 32 bits: utilisez l'invite de commande x86 Native Tools pour VS20xx.
――L'écran est trop petit pour comprendre la progression Afficher comme python build-demo.py --verbose.
--Le fichier non trouvé apparaît pendant la décompression de la source Qt En raison de la limite de caractères PATH ci-dessus.
ERREUR de projet: la construction de QtQml nécessite Python Le paramètre de coexistence de Python2 et Python3 n'est pas bon. À l'invite de commande, définissez py --version pour obtenir Python3 et py -2 --version pour obtenir Python2. Si PYTHONPATH et PYTHONHOME sont dans la variable d'environnement, supprimez-les. Seul le chemin Python3 a été défini dans le PATH et le chemin Python2 n'a pas été défini.
Si la construction de la racine système échoue, elle sera nettoyée lors de la reconstruction, vous devrez donc recommencer. La mémoire i5 de 6e génération de 8 Go nécessite environ 3 heures (Qt est énorme).
https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/pyqtdeploy.html Définir comme. Encore une fois, essayez de compiler le script Python maison que j'ai essayé plus tôt dans NUITKA-Utilities.
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_())
Dupliquez pyqt-demo.pdy dans test.pdy et utilisez-le comme modèle. Dupliquer test.py dans \ pyqtdeploy-2.4 \ demo \ data Renommez-le en test.py.dat et conservez-le.
pyqtdeploy test.pdy Éxécuter. Définissez le fichier source et analysez à nouveau le dossier de données. Enregistrez le contenu des autres onglets du menu Fichier tels quels.
https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/building.html Faites ce qui suit dans l'ordre
Makefile est créé par qmake et Makefile est exécuté par nmake. Vous devriez avoir un seul fichier exe test.exe dans build-win-64 \ release.
Le temps requis pour compiler test.exe était aussi court que 30 secondes à l'exclusion du temps de création de la racine système.
PyInstaller | NUITKA(-Utilities) | pyqtdeploy | |
---|---|---|---|
Taille unique exe | 34.8MB | 17.1MB | 36.2MB |
Résultat d'exécution | 0.8277249s | 0.7182800s | 0.7182917s |
Commencez | Légèrement lent | lent | de bonne heure |
La taille est la plus petite créée par la commande de création d'exe unique de nuitka-utilities, mais c'est parce qu'elle est compressée par le programme d'installation, et elle sera exécutée après son installation dans le dossier Temp au moment de l'exécution, donc le démarrage sera lent. ..
La taille d'un seul exe est presque la même entre Pyinstaller et pyqtdeploy, mais pyqtdeploy crée un binaire compilé pour qu'il démarre et s'exécute plus rapidement.
En supprimant les bibliothèques inutiles avec pyqtdeploy (vérification des modules pyqt uniquement pour QtWidget, QtGui, QtCore et sip), j'ai pu réduire la taille du binaire à environ 25 Mo. Pyqtdeploy semble être supérieur en termes de taille binaire, de démarrage et de vitesse d'exécution.
De plus, pyqtdeploy dit que vous pouvez développer des plates-formes multiples (Windows, MacOS, Linux, iOS, Android) avec la même source, je voudrais donc l'utiliser activement.
Recommended Posts