ubuntuusers.de

PyQt5 Programm als Snap packen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Wenn ich die __main__.py ausführe, bekomme ich auch nur die Fehlermeldung:

SystemError: Parent module '' not loaded, cannot perform relative import

Bearbeitet von sebix:

Forensyntax korrigiert.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Nicht die Datei direkt ausführen, sondern die beschriebene Syntax mit python -m modulname nutzen.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Das hat allerdings den großen Nachteil, dass viele Leute das Programm direkt mit ./Dateiname ausführen. Das man es mit python3 -m ausführen sollte, dass wissen wohl nur die Leute, die auch selbst in Python programmieren.

Gibt es eine Möglichkeit, das Programm in ein Snap zu packen ohne erst per Setup.py ein Modul erstellen zu müssen? Also, dass ich einfach nur meinen gesamten Code unverändert in einen Ordner werfen kann und nur in der snapcraft.yaml den Namen, Version, Pfad zur Datei, usw. anpassen müsste. Das würde für mich vieles vereinfachen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Wilma456 schrieb:

Das hat allerdings den großen Nachteil, dass viele Leute das Programm direkt mit ./Dateiname ausführen.

Dann muss ./Dateiname halt im selben Ordner wie das Modul liegen, damit es sich automatisch im Suchpfad befindet.

Ansonsten löst man das üblicherweise mit Entry-Points in der setup.py: https://amir.rachum.com/blog/2017/07/28/python-entry-points/ - dann wird bei der Installation des Moduls/Pakets ein Skript angelegt, das die bequeme Ausführung des Programms möglich macht.

Das man es mit python3 -m ausführen sollte, dass wissen wohl nur die Leute, die auch selbst in Python programmieren.

Sowas kann man auch einfach in die README schreiben...

Gibt es eine Möglichkeit, das Programm in ein Snap zu packen ohne erst per Setup.py ein Modul erstellen zu müssen? Also, dass ich einfach nur meinen gesamten Code unverändert in einen Ordner werfen kann und nur in der snapcraft.yaml den Namen, Version, Pfad zur Datei, usw. anpassen müsste. Das würde für mich vieles vereinfachen.

Jede Python-Datei ist effektiv ein Modul: https://docs.python.org/3/tutorial/modules.html Ich wüsste nicht, wie man da ohne setup.py auskommen sollte (irgendwie muss man ja festlegen, welche Dateien wo landen sollen) - aber es gibt z.B. mit Cookiecutter die Möglichkeit Vorlagen für etablierte Projektstrukturen zu nutzen, so dass man sich die Arbeit sparen kann, das alles selbst anzulegen.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich hatte mir dabei so etwas vorgestellt wie z.B. in einem anderen Projekt von mir (kein Python). Hier landet einfach der komplette Ordner im fertigen Snap. Dazu noch ein Shellskript dass die Umgebungsvariablen setzt und fertig. Dort kann ich bei Updates einfach den Quellcode in den Ordner kopieren und fertig. Geht sowas auch mit Python?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Probiers aus - solange dein Python-Code keine C-Extensions enthält, die für die Architektur kompiliert werden müssen, könnt das klappen.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Tschuldingung dass ich dich weider nerve, aber ich habe wieder ein kleines Problem: Ich habe jetzt eine setup.py für ein anderes Programm von mir. Alles funktioniert super und das Programm ist schon auf PyPI, allerdings gibt es noch Probleme beim Snap: Anscheinend wird QScintilla nicht ins Sanp eingefügt, obwohl es in der setup.py und der snapcraft.yaml als Abhängigkeit angegeben ist. Beim starten des Snaps kommt nur ein import Error. Kannst du bitte mal danach sehen? Du findest es hier.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Soweit ich das sehen kann, fehlt dir ein installiertes QScintilla, python-qscintillla ist ja nicht viel mehr als ein API-Wrapper.

Versuch mal statt der Version aus dem PIP das Paket python3-pyqt5.qsci installieren zu lassen, das zieht die benötigten Abhängigkeiten automatisch.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich habe jetzt den python3-pyqt5.qsci in die stage-packages gepackt und der Fehler ist weg. Dafür bekomme ich jetzt einen neuen Fehler:

Traceback (most recent call last):
  File "/snap/jdtextedit/x1/bin/jdTextEdit", line 11, in <module>
    load_entry_point('jdTextEdit==4.0', 'console_scripts', 'jdTextEdit')()
  File "/snap/jdtextedit/x1/lib/python3.5/site-packages/jdTextEdit/jdTextEdit.py", line 30, in main
    env = Enviroment()
  File "/snap/jdtextedit/x1/lib/python3.5/site-packages/jdTextEdit/Enviroment.py", line 71, in __init__
    self.lexerList = getLexerList()
  File "/snap/jdtextedit/x1/lib/python3.5/site-packages/jdTextEdit/LexerList.py", line 22, in getLexerList
    lexerList.append({"lexer":QsciLexerJSON,"name":"JSON","extension":[".json"],"xmlapi":""})
NameError: name 'QsciLexerJSON' is not defined

Kann es sein, dass snapcraft hier eine ältere Version von QScintilla in den Snap packt, als ich auf meinem Computer installiert habe? Wenn ja, wie bekomme ich die aktuelle Version? Ich benutze noch 16.04.

Und die Tatsache, dass das pip Paket nur die Bindings enthält, kommt mir auch ein wenig komisch vor. Ich habe mein Programm auch unter Windows getestet und dort hat die Installation des pip Paketes ausgereicht.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich habe gerade noch einmal nachgesehen: python3-pyqt5.qsci ist bei mir überhaupt nicht installiert. QScintilla wurde also wohl nur per pip installiert. Jetzt ist nur die Frage, warum es bei snapcraft nicht mit dem pip Paket funktioniert.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Ich komme vor dem WE nicht an einen Ubuntu Rechner, der die nötige Virtualisierung für snapcraft unterstützt (in VMs scheint es auf die Schnelle nicht zu funktionieren), aber dann kann ich mir das mal genauer ansehen.

Wie genau sieht denn der Import Error aus, wenn du das pip Paket nutzt und was ist an Dateien in dem Snap enthalten (z.B. mal die Ausgabe von tree für das eingebundene Dateisystem des Snaps zeigen)?

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Beim pip Paket funktioniert alles genauso so wie es soll. Du kannst es mit pip install jdTextEdit selbst ausprobieren. Allerdings habe ich vergessen, requests zu den Abhängigkeiten hinzuzufügen. Die setup.py wurde zwar schon verändert, aber auf PyPI werden die Änderungen erst mit dem nächsten Update verfügbar. Du musst es also noch selbst mit pip install requests installieren.

Hier noch die gewünschte Ausgabe von tree

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Ich habe das gerade mal unter Ubuntu 19.10 probiert, da verschluckt sich snapcraft schon an der snapcraft.yml - die Versionsnummer muss ein String sein (ist leicht zu beheben) und danach steigt er mit diesem Fehler aus:

Sorry, an error occurred in Snapcraft:
'NoneType' object has no attribute 'get'
We would appreciate it if you anonymously reported this issue.
No other data than the traceback and the version of snapcraft in use will be sent.
Would you like to send this error data? (Yes/No/Always/View) [no]: View
Traceback (most recent call last):
  File "/snap/snapcraft/3440/bin/snapcraft", line 11, in <module>
    load_entry_point('snapcraft==3.8', 'console_scripts', 'snapcraft')()
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/cli/_command.py", line 87, in invoke
    return super().invoke(ctx)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/cli/lifecycle.py", line 336, in clean
    lifecycle.clean(project, parts, steps.PRIME)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/internal/lifecycle/_clean.py", line 198, in clean
    config = project_loader.load_config(project)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/internal/project_loader/__init__.py", line 47, in load_config
    return Config(project)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/internal/project_loader/_config.py", line 209, in __init__
    snapcraft_yaml = self._expand_filesets(snapcraft_yaml)
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/internal/project_loader/_config.py", line 340, in _expand_filesets
    step_fileset = _expand_filesets_for(step, parts[part_name])
  File "/snap/snapcraft/3440/lib/python3.5/site-packages/snapcraft/internal/project_loader/_config.py", line 347, in _expand_filesets_for
    filesets = properties.get("filesets", {})
AttributeError: 'NoneType' object has no attribute 'get'

Ich bin weiß noch nicht, warum da ein None vorkommt, eventuell haben die etwas im Snap für snapcraft bei den Erweiterungen verbastelt...

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich habe auch noch mal am Wochenende versucht, mithilfe von GitLab ein Snap zu bauen, da ich so eventuell eine neuere Version von python3-pyqt5.qsci bekomme. Ich bekam allerdings die gleiche Fehlermeldung. Ich hatte das allerdings für einen Fehler des Docker Images gehalten und nicht weiter verfolgt. Der Fehler sieht mir allerdings wie ein Bug in snapcraft aus. Ansonsten müsste doch eine Fehlermeldung anzeigt werden, was an der Datei genau falsch sein soll.

Ich habe mich auch mal umgesehen: Das Snap von Eric, ein Programm das auch QScintilla benutzt, hat auch nur python3-pyqt5.qsci in der snapcraft stehen. Die scheinen also auch das DEB Packet zu benutzen. Bei mir ist allerdings das Problem, dass ich noch 16.04 benutze (werde erst mit 20.04 umsteigen) und die Version im DEB Paket bei mir zu alt ist, während die Version aus pip natürlich aktuell ist.

Eventuell werde ich noch versuchen, die DEB Pakete von PyQt5 zu entfernen, sodass er die Version von pip nimmt. Eventuell lag das Problem daran, dass die QScintilla Version von pip nicht mit der PyQt5 Version aus dem DEB kompatibel ist.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Das bauen von jdTextEdit als Snap hat inzwischen mithilfe von GitLab CI funktioniert, da dort eine neuere Ubuntu Version verwendet wird. Ich verlinke die CI mal falls wer vor dem gleichen Problem steht. Das fertige Programm ist auch schon auf Snapcraft. Bei der Desktop Datei gibt es allerdings noch ein Problem: Das Icon wird nicht angezeigt. Hier ist meine Desktop Datei:

[Desktop Entry]
Name=jdTextEdit
Comment= jdTextEdit is a powerful texteditor with a lot of features
Comment[de]= jdTextEdit ist ein umfangreicher Texteditor mit jeder Menge Funktionen
Icon=${SNAP}/meta/gui/jdtextedit.png
Exec=jdtextedit
Terminal=false
Type=Application
Categories=Qt;Development;

jdtextedit.png ist im selben Verzeichnis wie die .Desktop Datei.

Antworten |