Datei beim Kompilieren inkludieren?

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
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was benutzt du denn, um diese .BIN (ich kenne nur .EXEs aus der Praxis) zu erzeugen? Dieses Tool kennt hoffentlich einen Weg, irgendwelche Dateien zu buendeln.
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

Bisher verwende ich nuitka unter Ubuntu, das dann mit gcc kompiliert.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Habe ich noch nie benutzt. Das hat doch das hier https://nuitka.net/doc/user-manual.html ... stribution
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

__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 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.
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

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.
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.
Zuletzt geändert von BulliM am Montag 21. März 2022, 15:54, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

__deets__ hat geschrieben: Montag 21. März 2022, 15:52 Wieso funktioniert das nicht? Wenn du die Datei hast, kannst du die doch benutzen?
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__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das war nicht die Frage. Warum geht die Option von nuitka nicht? Da kannst du doch datenfiles mit dazu packen. Das ist doch fuer genau diesen Fall gedacht.
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

__deets__ hat geschrieben: Montag 21. März 2022, 16:17 Warum geht die Option von nuitka nicht?
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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

Gibt einen

Code: Alles auswählen

FATAL: Error, '--include-package-data' needs module name or pattern as an argument, not 'datei.xyz=datei'
BulliM
User
Beiträge: 11
Registriert: Mittwoch 16. März 2022, 12:11

Code: Alles auswählen

python 3 -m nuitka --onefile --include-data-file=datei.xyz=datei -python.py 
...funktioniert zumindest beim Kompilieren, nachdem ich patchelf installiert habe. Allerdings startet das *.bin jetzt gar nicht mehr.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten