Compilation Python avec pyqt deploy

introduction

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

Construire une démo (build sysroot)

https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/demo.html

Préparation (cette configuration dans l'environnement Windows)

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.)

Où j'étais accro

--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.

Créer un projet

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.

pyqtdeploy1.png

Construire la source

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.

Comparaison de fichiers exe uniques

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

Compilation Python avec pyqt deploy
Compilation facile de Python avec NUITKA-Utilities
[GUI avec Python] PyQt5-Préparation-
[GUI avec Python] PyQt5 -Paint-
[GUI avec Python] PyQt5 -Widget II-
Exécutez python3 Django1.9 avec mod_wsgi (déployer)
J'ai joué avec PyQt5 et Python3
[GUI avec Python] PyQt5-Widget personnalisé-
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Jouez avec 2016-Python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
J'ai créé une application graphique avec Python + PyQt5
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
1.1 Premiers pas avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python