Python-Kompilierung mit pyqt deploy

Einführung

Wenn ich versuche, ein Python-Programm binär zu verteilen, sind weder Pyinstaller noch Nuitka etwas unbefriedigend. Qt kann Binärdateien plattformübergreifend erstellen, und pyqt deploy scheint auch in der Lage zu sein, Binärdateien in Python zu erstellen. Also habe ich es einfach angefangen, aber überraschenderweise gibt es keinen Artikel auf Japanisch, also habe ich es geschrieben.

pyqtdeploy https://www.riverbankcomputing.com/software/pyqtdeploy/intro

Erstellen Sie eine Demo (Sysroot Build)

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

Vorbereitung (diese Konfiguration in der Windows-Umgebung)

Über 10 GB freie Festplatte Visual Studio Community Edition 2017 Perl (ActivePerl, StrawberryPerl usw. in PATH) Python2.7 (erforderlich zum Erstellen der Qt: Installer-Version, nicht anaconda / miniconda) Python3.7 (für Ziel: Installationsversion, nicht Anaconda / Miniconda)

Setzen Sie pyqt5 und pyqtdeploy mit pip von Python3.

Da die Anzahl der PATH-Zeichen im Qt-Build 255 überschreitet, sollten Sie sie vorab durch Ändern der Registrierung mit langen Dateinamen kompatibel machen. https://orebibou.com/2017/05/windows-10-insider-preview%E3%81%A7explorer%E3%81%A7260%E6%96%87%E5%AD%97%E4%BB%A5% Siehe E4% B8% 8A% E3% 81% AEpath% E3% 82% 92% E5% 8F% 96% E3% 82% 8A% E6% 89% B1% E3% 81% 86 /

Nehmen Sie die Quellen wie Qt und Python und legen Sie sie im Demo-Ordner der pyqt-Bereitstellungsquelle ab. Die erforderliche Quelle befindet sich in sysroot.json. (OpenSSL, Python, PyQt5, zlib, qt-überall usw.)

Wo ich süchtig war

--MSV 2015/2017 nicht gefunden Führen Sie den Build-Befehl an der Eingabeaufforderung von Visual Studio aus. Bauen Sie auf 64bit: x64 Native Tools-Eingabeaufforderung für VS20xx auf Auf 32-Bit aufbauen: Verwenden Sie die Eingabeaufforderung x86 Native Tools für VS20xx.

――Das Display ist zu klein, um den Fortschritt zu verstehen Anzeige als Python build-demo.py --verbose.

--Datei nicht gefunden wird während der Dekomprimierung der Qt-Quelle angezeigt Aufgrund der oben genannten PATH-Zeichenbeschränkung.

--Project ERROR: Zum Erstellen von QtQml ist Python erforderlich Die Einstellung für die Koexistenz von Python2 und Python3 ist nicht gut. Stellen Sie an der Eingabeaufforderung py --version ein, um Python3 abzurufen, und py -2 --version, um Python2 abzurufen. Wenn sich PYTHONPATH und PYTHONHOME in der Umgebungsvariablen befinden, löschen Sie sie. Im PATH wurde nur der Python3-Pfad festgelegt, und der Python2-Pfad wurde nicht festgelegt.

Ein Projekt erstellen

https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/pyqtdeploy.html Festlegen als. Versuchen Sie erneut, das hausgemachte Python-Skript zu kompilieren, das ich zuvor in NUITKA-Utilities ausprobiert habe.

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_())

Dupliziere pyqt-demo.pdy in test.pdy und verwende es als Vorlage. Duplizieren Sie test.py in \ pyqtdeploy-2.4 \ demo \ data Benennen Sie es in test.py.dat um und behalten Sie es bei.

pyqtdeploy test.pdy Ausführen. Legen Sie die Quelldatei fest und scannen Sie den Datenordner erneut. Speichern Sie den Inhalt anderer Registerkarten unverändert aus dem Menü Datei.

pyqtdeploy1.png

Quelle erstellen

https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/building.html Gehen Sie wie folgt vor

Makefile wird von qmake erstellt und Makefile wird von nmake ausgeführt. Sie sollten eine einzige exe-Datei test.exe in build-win-64 \ release haben.

Die zum Kompilieren von test.exe erforderliche Zeit betrug nur 30 Sekunden ohne die Sysroot-Erstellungszeit.

Vergleich einzelner exe-Dateien

PyInstaller NUITKA(-Utilities) pyqtdeploy
Einzelne exe Größe 34.8MB 17.1MB 36.2MB
Ausführungsergebnis 0.8277249s 0.7182800s 0.7182917s
Anlaufen Etwas langsam langsam früh

Die Größe ist die kleinste, die mit dem Befehl zum Erstellen einer einzelnen Exe von nuitka-utilities erstellt wurde. Dies liegt jedoch daran, dass sie vom Installationsprogramm komprimiert wird und nach der Installation im Ordner Temp zum Zeitpunkt der Ausführung ausgeführt wird, sodass der Start langsam ist. ..

Die Größe einer einzelnen Exe ist zwischen Pyinstaller und pyqtdeploy fast gleich, aber pyqtdeploy erstellt eine kompilierte Binärdatei, damit sie schneller gestartet und ausgeführt wird.

Durch Entfernen unnötiger Bibliotheken mit pyqtdeploy (Überprüfung der pyqt-Module nur auf QtWidget, QtGui, QtCore und sip) konnte ich die Größe der Binärdatei auf etwa 25 MB reduzieren. Pyqtdeploy scheint in Bezug auf Binärgröße, Start und Ausführungsgeschwindigkeit überlegen zu sein.

Laut pyqtdeploy können Sie plattformübergreifende (Windows, MacOS, Linux, iOS, Android) mit derselben Quelle entwickeln, daher möchte ich sie aktiv nutzen.

Recommended Posts

Python-Kompilierung mit pyqt deploy
Einfache Python-Kompilierung mit NUITKA-Utilities
[GUI mit Python] PyQt5-Vorbereitung-
[GUI mit Python] PyQt5 -Paint-
[GUI mit Python] PyQt5 -Widget II-
Führen Sie python3 Django1.9 mit mod_wsgi aus (deploy)
Ich habe mit PyQt5 und Python3 gespielt
[GUI mit Python] PyQt5 -Custom Widget-
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
Spielen Sie mit 2016-Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
1.1 Erste Schritte mit Python
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
Sprachanalyse mit Python
Denken Sie an Yaml mit Python
Kinesis mit Python betreiben
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python