Datei beim Kompilieren inkludieren?
Ich möchte Python zu einer Anwendung kompilieren. Die erstellte *.bin soll eine Datei *.xyz (non-python) über einen subprocess.POPEN mit einem anderen installierten Programm verarbeiten lassen. Auf der Kommandozeile klappt das, weil die Datei mit im Projektordner liegt. Beim kompilierten *.bin, das die Anwender herunterladen können, ist die aber nicht enthalten. Wie realisiere ich das, ohne die gemeinsam in ein Archiv packen zu müssen? Ideal wäre es, die Datei gleich mit einzukompilieren. Geht das überhaupt? Oder muss ich die Datei nachträglich downloaden, um sie dann in der *.bin verwenden zu können?
@BulliM: Warum machst du dir diese zusätzliche Arbeit? „Normal“ verteilte Python-Programme funktionieren auch sehr gut und du hast solche Probleme nicht, weil der Rest der Welt das genau so macht. Ein ganz normalen Wheel zum Beispiel kann problemlos beliebige Dateien enthalten.
Wenn du unbedingt eine einzelne Datei haben willst (die nicht wie ein Wheel installiert werden muss), dann kannst du dir zipapps angucken. Da funktionieren dann auch Sachen wie `importlib.resources`, um Datendateien in die Distribution einzubauen.
Wenn du unbedingt eine einzelne Datei haben willst (die nicht wie ein Wheel installiert werden muss), dann kannst du dir zipapps angucken. Da funktionieren dann auch Sachen wie `importlib.resources`, um Datendateien in die Distribution einzubauen.
Ah. Habe ich noch nie benutzt. Das hat doch das hier https://nuitka.net/doc/user-manual.html ... stribution
Das hatte ich schon gesehen. Aber das funktioniert so gar nicht. Ich finde kein Beispiel, das auf meinen Fall angewendet werrden kann. Also Datei holen und dann ausführen lassen.__deets__ hat geschrieben: Montag 21. März 2022, 15:26 Ah. Habe ich noch nie benutzt. Das hat doch das hier https://nuitka.net/doc/user-manual.html ... stribution
Das sehe ich mir an. Hoffentlich funktioniert das. Ich programmiere Python noch nicht lange. Was ein Wheel ist und wie man das benutzen kann, weiß ich noch gar nicht. Ich habe ein GUI, über das User die eingepackte Datei verarbeiten sollen. Ist ein Benchmark, daher immer gleich.narpfel hat geschrieben: Montag 21. März 2022, 15:26 @BulliM: Warum machst du dir diese zusätzliche Arbeit? „Normal“ verteilte Python-Programme funktionieren auch sehr gut und du hast solche Probleme nicht, weil der Rest der Welt das genau so macht. Ein ganz normalen Wheel zum Beispiel kann problemlos beliebige Dateien enthalten.
Wenn du unbedingt eine einzelne Datei haben willst (die nicht wie ein Wheel installiert werden muss), dann kannst du dir zipapps angucken. Da funktionieren dann auch Sachen wie `importlib.resources`, um Datendateien in die Distribution einzubauen.
Zuletzt geändert von BulliM am Montag 21. März 2022, 15:54, insgesamt 1-mal geändert.
Wieso funktioniert das nicht? Wenn du die Datei hast, kannst du die doch benutzen? Und wenn du nur die Daten hast (sowas kenne ich von anderen Systemen wie QRC), dann kannst du die Datei doch trivial temporaer anlegen und befuellen. Oder gar via subprocess und STDIN arbeiten, falls dein nachgelagertes Tool das erlaubt.
Natürlich geht das. Wenn die Datei dann neben dem *.bin liegt oder im /root. Tut sie aber beim Anwender ja nicht, die das *.bin herunterladen.__deets__ hat geschrieben: Montag 21. März 2022, 15:52 Wieso funktioniert das nicht? Wenn du die Datei hast, kannst du die doch benutzen?
Um das zu beantworten, habe ich das Thema hier erstellt. Ich bin nicht davon ausgegangen, dass viele nuitka nutzen. Daher war meine Frage eher allgemein gehalten: Wie würdet ihr das machen?
Ich bin verwirrt. Ich wuerde die Option dieses Tools zum einbinden von Datenfiles benutzen. Dann ist das doch Teil des BIN-files, und kann eben an andere Tools uebergeben werden. Wahlweise weil es einen Pfad hat (dafuer muss dann ein Archiv irgendwie entstanden sein, und entpackt), oder weil aus dem Code heraus die Daten irgendwie zugreifbar sind, und dann speichert man die in eine temporaere Datei. Und fuettert die in das Programm. Was genau daran ist unklar? Oder anders gefragt: hast du diese Option probiert? Was genau macht die? Wieso reicht das dann nicht?
Gibt einen
Code: Alles auswählen
FATAL: Error, '--include-package-data' needs module name or pattern as an argument, not 'datei.xyz=datei'
Code: Alles auswählen
python 3 -m nuitka --onefile --include-data-file=datei.xyz=datei -python.py
Also so wie ich das verstehe muss die Datei innerhalb eines Python-Packages stecken. So wie auch bei anderen Buendlern, wie setuptools. Da muss dann schon deine Projektstruktur entsprechend erwachsen sein, und nicht nur eine einzelne Python-Datei.
Aber letztlich aendert es auch nix an der Antwort auf die Frage: so ein Mechanismus ist der Weg, den man geht. Einen anderen sehe ich nicht, ausser ggf. noch die Daten einfach roh als String in eine Python-Datei zu schreiben. Und via import hat man dann da zugriff. Anders geht's nicht. Wenn nuitka das nicht kann, oder du das nicht hinbekommst, habe ich da auch keine bessere Antwort.
Aber letztlich aendert es auch nix an der Antwort auf die Frage: so ein Mechanismus ist der Weg, den man geht. Einen anderen sehe ich nicht, ausser ggf. noch die Daten einfach roh als String in eine Python-Datei zu schreiben. Und via import hat man dann da zugriff. Anders geht's nicht. Wenn nuitka das nicht kann, oder du das nicht hinbekommst, habe ich da auch keine bessere Antwort.