Pyinstaller konfigurieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Hallo, ich versuche grad eine *.py-Datei umzupacken. Leider bricht der Prozess ab mit der Fehlermeldung:

Code: Alles auswählen

Aborting build process due to attempt to collect multiple Qt bindings packages: attempting to run hook for 'PyQt6', while hook for 'PySide6' has already been run! PyInstaller does not support multiple Qt bindings packages in a frozen application - either ensure that the build environment has only one Qt bindings package installed, or exclude the extraneous bindings packages via the module exclusion mechanism (--exclude command-line option, or excludes list in the spec file).
Die abhängigen Pakete sind:

Code: Alles auswählen

from mainwindow import Ui_MainWindow
from PySide6.QtCore import  QDateTime,  QSettings
from PySide6.QtGui import Qt, QFont, QColor, QLinearGradient, QPainter, QPen, QBrush
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidgetItem
from PySide6 import QtCharts
from datetime import datetime
import connect_db
import thingspeak_query
import sys
Ich lese daraus, dass 'multiple Qt bindings packages' in die spec-Datei extra einzubinden sind - richtig?
als Beispiel:

Code: Alles auswählen

datas=["thingspeak_db.db"],
ist das richtig so?
Frage müssen alle Pakete, oder welche Pakete, so eingebunden werden, wie ist die Syntax?

Danke und eine schöne Weihnachtszeit - Stefan
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn pyinstaller behauptet, dass Du sowohl pyqt als auch pyside benutzt, dann wird es schon recht haben. Du scheinst ja ui-Dateien in py-Dateien umgewandelt zu haben. Das könnte die Ursache sein und ist auch falsch. ui-Dateien lädt man direkt.
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Die Interpretation ist falsch — 'multiple Qt bindings packages' muss man nicht extra eintragen, das geht einfach nicht. Es macht keinen Sinn, und im Thema PyQt6 / QTableView() hast Du das doch selbst erlebt, dass das Probleme macht zwei Qt-Anbindungen zu mischen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

nun, wenn ich die .ui importier mit:

Code: Alles auswählen

import os
import sys

from PyQt6 import QtCore, QtGui, QtWidgets, uic

basedir = os.path.dirname(__file__)

class MainWindow(QtWidgets.QMainWindow):
   def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       uic.loadUi(os.path.join(basedir, "mainwindow.ui"), self)

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
erscheint wiederum die Fehlermeldung:

Code: Alles auswählen

ModuleNotFoundError: No module named 'qchartview'
die nachträgliche Installation von:

Code: Alles auswählen

pip install PyQt6-Charts
bringt auch keinen Erfolg.
Tut mir leid, wie ist der richtige Weg?
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Ist das denn jetzt relevant für das ursprüngliche Problem? Also bist Du jetzt komplett von PySide auf PyQt umgestiegen? Falls Nein, macht das keinen Sinn Importprobleme bei PyQt zu lösen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Ach Gottchen, nein ich möchte bei PySide6 bleiben. Die Hilfe von https://doc.qt.io/qtforpython-6/tutoria ... files.html brachte Erfolg.
Dann werde ich heute Abend weiter basteln :-)

Danke und einen schönen 3.Advent....
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

ach ja, ich hatte von dieser Seite:

Code: Alles auswählen

# File: main.py
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODevice

if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui_file_name = "mainwindow.ui"
    ui_file = QFile(ui_file_name)
    if not ui_file.open(QIODevice.ReadOnly):
        print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")
        sys.exit(-1)
    loader = QUiLoader()
    window = loader.load(ui_file)
    ui_file.close()
    if not window:
        print(loader.errorString())
        sys.exit(-1)
    window.show()

    sys.exit(app.exec())
zum Import der .ui angewendet. An der Stelle von 'loader = QUiLoader()' hat Python gebockt - keine weiter Ausführung des Codes, keine Fehlermeldung.
Bild

Hab mich daher der Worte von __blackjack__ erinnert und schau an: in einem Modul hatte sich sich noch ein 'from PyQt6.QtCore import...' versteckt.
Das in ein ' from PySide6.QtCore' umgeschrieben brachte den gewünschten Erfolg.

Code: Alles auswählen

 pyinstaller --name="Diagramm" --windowed main.py
lief bis Ende fehlerfrei durch - grandios.

Habt Dank für Eure Hilfe - Stefan
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`sys.exit()` mit -1 ist keine gute Idee. Wie würdest Du *das* denn in einer Shell des Systems prüfen? Das ist ja sowieso schon reichlich unterspezifiziert und systemabhängig, da würde ich im Grunde nicht mal davon ausgehen, dass alle vorzeichenlosen Bytewerte wirklich überall funktionieren.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

... als 'Hobbyschreiber' stelle ich mir solche Fragen nicht als erstes, man verlässt sich auf die Dokumentation. Aber auch in der abgespeckte Variante:

Code: Alles auswählen

# File: main.py
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODevice

if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui_file_name = "mainwindow.ui"
    ui_file = QFile(ui_file_name)
	
    loader = QUiLoader()
    window = loader.load(ui_file)
    ui_file.close()
	
    window.show()

    sys.exit(app.exec())
hatte sich Python in der Zeile ' loader = QUiLoader()' verschluckt, warum? Ich kann keinen anderen Weg finden, die .ui unter Nutzung von PySide6 zu laden.
Alle Tutorials etc. beziehen sich auf PyQt6.
Benutzeravatar
sparrow
User
Beiträge: 4528
Registriert: Freitag 17. April 2009, 10:28

Schläge auf den Rücken, helfen beim Verschlucken.

Ansonsten hilft die konkrete Fehlermeldung. So kann man nur raten, was da schief gehen könnte. Und das hilft wenig.
Antworten