Mit Python zugriff auf ein kompiliertes Pythonprogram

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
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Hallo,

Ich habe ein Spiel in Pygame geschrieben und möchte einen Level-Editor als 2tes Programm schreiben. Ich möchte aber nicht, dass der Level-Editor Teil des Spieles ist sondern ein separates Program. Anfänglich hatte ich die Levels in einem Yaml-file dargestellt, dass dann zur Laufzeit ausgelesen wird - d.h. Level-Editor (A) ändert Yaml-File (B) dass dann von Game (C) ausgelesen wird. Nun möchte ich aber auf dieses Zwischenschritt (B) verzichten können so dass ich direkt von (A) die Levels in (C) ändern kann. Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann. Darum will ich die Levels jetzt in einem String im Spiel (C) "hart rein coden". Nur verstehe ich nicht ganz, wie ich diese nachträglich ändern kann, da das Spiel (C) ja schon kompiliert ist. Müsste ich hierzu das Spiel wieder disassemblieren und dann die entsprechende Variable überschreiben bzw. ersetzen, oder gibt es da eine wesentlich simplere Variante? Ich bin sonst ratlos wie man so etwas realisieren soll.

Und falls es keinen anderen Weg gibt, kann ich mittels eines Modules auch eine mit py2exe erstellte Exe-Datei wieder in halbwegs lesbaren Python-Code zurückverwandeln?
Ich hoffe, ihr versteht mein Problem.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DKKA hat geschrieben:Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann.
Hier kann ich nur fragen: Warum? Damit machst Du Dir das Leben imho unnötig schwierig!

Du kannst natürlich die Leveldaten direkt in ein Python-Modul schreiben - aber dann wird das Bearbeiten irgend wie deutlich aufwendiger... und wieso sollte man Code und Daten mischen wollen?

Zur Not kannst Du doch auch ein Archiv erstellen und das als Zip-File mitliefern; du hättest dann eben nicht 100 YAML-Files, sondern nur ein Zip-Archiv. Wäre das nicht ggf. ein Kompromiss?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Hyperion hat geschrieben:
DKKA hat geschrieben:Ich möchte nicht immer ein separates Yaml-File mitliefern müssen, auch möchte ich, dass man nur über den Level-Editor die Leves ändern kann.
Hier kann ich nur fragen: Warum? Damit machst Du Dir das Leben imho unnötig schwierig!

Du kannst natürlich die Leveldaten direkt in ein Python-Modul schreiben - aber dann wird das Bearbeiten irgend wie deutlich aufwendiger... und wieso sollte man Code und Daten mischen wollen?

Zur Not kannst Du doch auch ein Archiv erstellen und das als Zip-File mitliefern; du hättest dann eben nicht 100 YAML-Files, sondern nur ein Zip-Archiv. Wäre das nicht ggf. ein Kompromiss?
Hm, wie meinst du die Leveldaten direkt in ein Python-Modul schreiben? Einfach ein neues Py-File erstellen, dass nur die Levels enthält und das dann importieren?

Ich weiss, es ist nicht wirklich eine Python-Fragen, aber gibt es eine Möglichkeit wie ich die Yaml-Levelfiles irgendwie in die .Exe verpacken kann und auch wieder darauf zurück greifen kann um sie zu ändern? Ich möchte natürlich das Spiel mit py2exe als .Exe umwandeln und ich finds halt schöner, wenn ich nur ein File habe. Ausserdem möchte ich halt, dass man die Files mit dem Leveleditor ändern soll und das man nicht einfach das Yamlfile öffnen kann und schnell mit txt-editor ändern kann. Sonst wäre mein Leveleditor für die Katze und es würde zudem viel Fehleranfälliger werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DKKA hat geschrieben: Hm, wie meinst du die Leveldaten direkt in ein Python-Modul schreiben? Einfach ein neues Py-File erstellen, dass nur die Levels enthält und das dann importieren?
Ja! Oder eben ein bestehendes...
DKKA hat geschrieben: Ausserdem möchte ich halt, dass man die Files mit dem Leveleditor ändern soll und das man nicht einfach das Yamlfile öffnen kann und schnell mit txt-editor ändern kann. Sonst wäre mein Leveleditor für die Katze und es würde zudem viel Fehleranfälliger werden.
Das ist imho albern ;-)

Du kannst Deine Leveldaten ja auch im Netz platzieren; das Programm läd sie sich beim Starten einfach runter... ich finde dennoch sonderbar, sich so viele künstliche Probleme zu schaffen. Freu Dich doch lieber, wenn viele Leute Dein Spiel zocken - da ist es doch egal, was für ein Tool sie zum Bauen von Leveln nutzen... :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ich würd's sogar als Antipattern sehen, wenn die Spieledaten nicht völlig getrennt von Programm sind.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Das ist kein Antipattern. Das ist einfach Mist.

Da will man lediglich einen winzigen Aspekt im Level ändern und muss gleich das komplette Programm nebst dazugehörigen Interpreter, Modulen und ggf. DLL neu packen und ausliefern?

Nimm Dir einen Brombeerstrauch und kasteie Dich damit so lange selbst, bis dieser Gedanke aus Deinem Kopf verschwunden ist! ;)
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@DKKA: Du willst also mit allen Mitteln verhindern, dass man Dein Spiel spielt, dass man Levels unabhängig vom Programmcode tauschen kann. Falls Dein LevelEditor gut ist, wird niemand die Text-Dateien direkt ändern, falls Dein LevelEditor Schrott ist, sind alle froh, dass sie die Level mit einem Texteditor ändern können.
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

Sirius3 hat geschrieben:@DKKA: Du willst also mit allen Mitteln verhindern, dass man Dein Spiel spielt, dass man Levels unabhängig vom Programmcode tauschen kann. Falls Dein LevelEditor gut ist, wird niemand die Text-Dateien direkt ändern, falls Dein LevelEditor Schrott ist, sind alle froh, dass sie die Level mit einem Texteditor ändern können.
Ich finds halt schöner, wenn man alles nur als eine Datei hat... Und ich glaube der Leveleditor ist sicherlich besser als das Textfile. ;) Ich verstehe natürlich alle aufgeführten Punkte, aber ich möchte trotzdem noch nachfragen, ist es wirklich so schwer/so viel Arbeit einen einzigen String zu ersetzen? Ich kenne mich mit disassemblieren gar nicht aus, weiss aber, dass es ein dis-modul in Python gibt und ich beherrsche halbwegs die Grundlagen von TASM. Aber natürlich habe ich noch nie so etwas in diese Richtung gemacht. Kenne nur die Register+Flags und die Grundoperationen... Und wäre cool wenn ihr mir vielliecht 1-2 gute links/tutorial zum dis-module geben könnt, das wollte ich mir schon lange mal ansehen. Vielen Dank.
BlackJack

@DKKA: Mit dem `dis`-Modul kann man CPython-Bytecode von Code-Objekten in eine lesbare Form bringen. Das hat recht wenig mit TASM und Prozessorregistern zu tun. Und es gibt, zumindest in der Standardbibliothek auch keinen Compiler mit dem man die Ausgabe vom `dis`-Modul wieder in Bytecode verwandeln könnte. Das ist nur dazu da wenn man sich den Bytecode mal anschauen möchte, zum besseren Verständnis was die Laufzeitumgebung da eigentlich ausführt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DKKA hat geschrieben: Ich finds halt schöner, wenn man alles nur als eine Datei hat...
Also eigentlich ist einem User das vollkommen egal! Den interessiert nur, wie *einfach* sich etwas installieren lässt. Willst Du also das einfach gestalten, ok. Dazu braucht es für Windows allerdings lediglich einen guten Installer ;-)
DKKA hat geschrieben: Und ich glaube der Leveleditor ist sicherlich besser als das Textfile. ;)
Naja, dann wird ihn ja auch jeder Interessierte verwenden - und wenn jeman ein Meisterwerk an Level erschafft, ohne Deinen Editor zu verwenden, ist das dann etwa unerwünscht? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten