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
https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/demo.html
Ü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.)
--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.
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.
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.
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