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.
(Themenstarter)
Anmeldungsdatum: Beiträge: Zähle... |
Wenn ich die SystemError: Parent module '' not loaded, cannot perform relative import Bearbeitet von sebix: Forensyntax korrigiert. |
Anmeldungsdatum: Beiträge: 10978 |
Nicht die Datei direkt ausführen, sondern die beschriebene Syntax mit python -m modulname nutzen. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
Anmeldungsdatum: Beiträge: 10978 |
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.
Sowas kann man auch einfach in die README schreiben...
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. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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? |
Anmeldungsdatum: Beiträge: 10978 |
Probiers aus - solange dein Python-Code keine C-Extensions enthält, die für die Architektur kompiliert werden müssen, könnt das klappen. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
Anmeldungsdatum: Beiträge: 10978 |
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. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
Anmeldungsdatum: Beiträge: 10978 |
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)? |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
Anmeldungsdatum: Beiträge: 10978 |
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 |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 290 |
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. |