Python Code in Datei rausschreiben und aus Datei einfügen

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.
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Hallo zusammen,

ist es in Python möglich, dass ich Python-Code, den ich z.B. in einem txt-File habe (also kein vollständiges Python-Modul oder Skript), in einen Python-Code integriere, so wie man in C Header-Dateien einfügt?
Ist es außerdem möglich, ein Stück Code aus einem Python-Skript, z.B. durch Zeilenangabe, automatisch in ein txt-File herauszuschreiben?

Es geht darum, dass ich eine bestimmte Konfiguration von Variablendeklarationen so, wie sie im Code steht, als txt-Datei abspeichern will und in einen anderen Code zu einem späteren Zeitpunkt wieder einfügen will.

Viele Grüße
Khris
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich bin mir sehr sicher, dass es bessere Lösungen für das Problem gibt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Khris hat geschrieben: Es geht darum, dass ich eine bestimmte Konfiguration von Variablendeklarationen so, ...
In Python deklariert man keine Variablen - kannst Du uns ggf. mal ein solche Fragment zeigen, von dem Du sprichst?

Generell ist das alles möglich - allerdings musst Du Dir da schon selber ein solches Werkzeug schreiben. Mittels "import" lassen sich nur Python-Module einbinden.

Die Frage ist nur, ob das so auch sinnvoll ist! Für Konfigurationen greift man eben auf ein sinnvolles Serialisierungsformat zurück, etwa INI, JSON, YAML oder gar XML.

Insofern fürchte ich, dass Dein Plan eher ein XY-Problem ist. Also beschreibe doch genauer, was Du erreichen willst und was die Anforderungen sind. Ich denke es lohnt sich, das im Vorfeld abzuklären, bevor Du Dir das etwas zusammenschusterst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Ich habe ein Python-Skript, das ein Strahlungstransfermodell steuert. Das Skript erstellt die verschiedenen Input-Dateien für das Modell und führt es aus.
Eine Berechnung kann z.B. aus zehn Einzelrechnungen bestehen, wobei ein Input-File immer gleich bleibt, das andere z.B. für jeden Modelllauf etwas anders aussieht.
Ich mag es nicht, überall Dateien herumfliegen zu haben, darum habe ich die Erstellung der Input-Files komplett in das Python-Skript verlegt, d.h. alle Werte werden in dem Skript gesetzt.
Was ich nun möchte ist, dass ich eine solche Konfiguration, die ich in dem Skript vornehme, lesbar abspeichern kann, so dass ich sie später einfach wieder laden kann, wenn ich dieselbe Berechnung nochmal machen möchte. Das simpelste wäre daher, einfach den obersten Teil des Skripts auszuschneiden und als txt abzuspeichern, wenn ich das dann später wieder genauso einfach einfügen könnte.
Kurz: Ich mache eine Konfiguration direkt im Skript und möchte dennoch diese Konfiguration lesbar abspeichern und laden können.
Es gibt sicher auch andere Wege, das zu erreichen, wenn das hier nicht klappt, aber die wären wohl komplizierter.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Situation ist - zumindest mir - noch nicht 100%ig klar geworden. Kannst du vielleicht das, was dauerhaft gespeichert werden soll, beispielhaft posten? Falls es umfangreicher ist, dann gerne auch nur ein Ausschnitt davon. Es muss nicht alles zurückverfolgt werden können. Mich würde nur die genrelle Struktur des Ganzen interessieren. Dann kann man dir sicher eine passenderen Lösungsvorschlag geben... :)
deets

Nein, die waeren nicht komplizierter. Denn das was du da machst ist so einfach nicht unterstuetzt. Was aber unterstuetzt ist, ist zB ini-file basierte Konfigurationsdateien, mit denen du dann eine simple, klare Repraesentation deiner Konfigurationen hast. Oder zB JSON, falls du etwas komplexere Strukturen brauchst, und gleichzeitig sauber die verschiedenen Typen gewandelt haben willst.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hyperion hat geschrieben:Generell ist das alles möglich - allerdings musst Du Dir da schon selber ein solches Werkzeug schreiben.
Naja, `pickle` existiert. Es kommt halt nur nicht mit Code klar, der erst zur Laufzeit erstellt wird (soweit ich weiß). Falls es aber ein Template-File gibt, kann man vielleicht irgendwie auf diesem Ding arbeiten. Dazu bräuchte man aber, wie schon gesagt, mehr Details. Andererseits: Wenn man auf nem Template-File arbeitet, dann kann man das ja auch ohne `pickle` direkt abspeichern. Wäre halt interessant zu erfahren, wie so ein Skript, was der OP verwendet, zustande kommt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hab ne Idee, wie's machbar ist: Den Code in IPython erzeugen, dann den Inhalt der Funktion mit den zwei Fragezeichen in der IPython-Shell anzeigen, dies als Screenshot abspeichern und dann mittels Schrifterkennungssoftware in TXT überführen, ggf vorher noch eine JPEG2PDF-Umwandlung vollziehen, falls die Schrifterkennung nicht mit reinen Grafikdateien klarkommt. Gut, oder? ^^
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

snafu hat geschrieben:Ich hab ne Idee, wie's machbar ist: Den Code in IPython erzeugen, dann den Inhalt der Funktion mit den zwei Fragezeichen in der IPython-Shell anzeigen, dies als Screenshot abspeichern und dann mittels Schrifterkennungssoftware in TXT überführen, ggf vorher noch eine JPEG2PDF-Umwandlung vollziehen, falls die Schrifterkennung nicht mit reinen Grafikdateien klarkommt. Gut, oder? ^^
:lol:

Ernsthaft, ich denke, über shell script und cat-Kommandos könnte ich das Problem halbwegs elegant lösen.
Pickle, soweit ich das verstehe, scheint mir auf Anhieb nicht so hilfreich zu sein.
Vielen Dank für die Antworten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Khris hat geschrieben:Ernsthaft, ich denke, über shell script und cat-Kommandos könnte ich das Problem halbwegs elegant lösen.
Pickle, soweit ich das verstehe, scheint mir auf Anhieb nicht so hilfreich zu sein.
Vielen Dank für die Antworten.
Lass doch diesen Unfung. Eine Konfigurationsdatei in Python ist so viel einfacher als irgendwelche Scripts, welche neue Dateien zusammenbasteln. Zu allen genannten Möglichkeiten existieren in Python bereits fertige Module, das sind nur wenige Zeilen Arbeit für eine vernünftige Lösung.
Das Leben ist wie ein Tennisball.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich fand diesbezüglich das hier vorgeschlagene Bunch-Rezept hilfreich. Das dürfte sich ziemlich leicht in eine Konfigurationsdatei schreiben und wieder daraus laden lassen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Khris: Um welches Strahlungstransfermodell handelt es sich denn?

Grüße
Gerrit
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Khris hat geschrieben: Ernsthaft, ich denke, über shell script und cat-Kommandos könnte ich das Problem halbwegs elegant lösen.
Ehrlich, das klingt für mich extrem unelegant! Und fürs Templating an sich (nichts anderes machst Du ja hier) gibt es tolle Python-Libs, mit denen Du das auch hättest tun können. Das ändert jedoch nichts daran, dass der Lösungsweg an sich ziemlich schräg klingt.

Ehrlich gesagt wäre ich schon am richtigen Code interessiert - die Lösung und das Vorgehen lässt da auf krasse Konzeptionsfehler schließen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Okay, hier nochmal das, was ich machen will:

Ich habe einen Python-Code, der zunächst einen längeren "Header" enthält, wo ich diverse Größen zuweise.
Nach diesem "Header" kommt der eigentliche Code, in dem mit Hilfe dieses Headers erst Input-Dateien für das Modell erstellt werden und dann wird das Modell ausgeführt.

Der "Header" sieht so aus (abgekürzt), und ich will schlicht und einfach seinen gesamten Inhalt in eine eigene Datei abspeichern. Da ich auch viel mit C arbeite, hatte ich zunächst daran gedacht, das so zu lösen wie mit .h-Dateien und einfach den Dateinamen der einzufügenden Datei anzupassen. Lässt sich aber wohl so nicht machen.

Ich habe mir gerade das ConfigParser-Modul angeschaut, das schaut schon nach einer guten Richtung aus, aber es kann, soweit ich das sehe, keine Listen abspeichern, und ich brauche auch Listen.

Code: Alles auswählen

# CONFIGURATION HEADER START
fname='result'                                                                        # filename of the result files
name=datetime.datetime.now().strftime("%Y%m%d") + '3D-cloud-ris1-g7-nocb-up-8.5mm-up' # calculation folder name
wavelength=8500000                      # wavelength
mc_photons=100000                       # number of photons
[...]
thetas=[90.0]                           # theta, 0 degree=nadir, 180 degree=zenith
phis=['s',80,100,2]                     # phi, 0 degree=north, rotation is clockwise
firstbin=0.0                            # start of first bin in km
number_of_bins=80                       # number of bins
binwidth=0.2                            # in km
polarisation=1                          # 0 = unp, 1=Q, 2=U, 3=V
pulse_length=30.                        # in m
scatter_outputs=3                       # number of scattering outputs
# CONFIGURATION HEADER END
@gkuhl: libRadtran
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Also Listen abzuspeichern sollte eigentlich kein Problem sein. Einfach als string speichern (';'.join(my_list)). Bei Auslesen von Listen dann eben entsprechen konvertieren (my_list.split(';')).
BlackJack

@Khris: JSON kann auch Listen speichern (`json`-Modul in der Standardbibliothek).
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Ich bastele gerade was mit ConfigParser, sollte funktionieren.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Khris: Für "libRadtran" wollte ich auch schon länger eine Python Module schreiben. Leider in den letzten Jahren nicht die Zeit dafür gefunden. Wenn du da was auf die Beine stellt, würde mich das Ergebnis durchaus interessieren.

Zu den "input" Dateien, ist dir hoffentlich bewusst, dass libRadtran diese von "stdin" liest. Du brauchst also den Umweg über irgendwelche Eingabedateien nicht sondern kannst deine Befehle als String an "uvspec" senden. Schau dir dazu auch mal die Frage "How to implement loops in libRadtran?" in libRadtran FAQ an.

Grüße
Gerrit
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Khris hat geschrieben: Ich habe mir gerade das ConfigParser-Modul angeschaut, das schaut schon nach einer guten Richtung aus, aber es kann, soweit ich das sehe, keine Listen abspeichern, und ich brauche auch Listen.
Na dann nimm doch JSON :-)

Alternativ kannst Du es ja auch als Python-Modul belassen und dieses einfach per `import` in Deine anderen Module einbinden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich hab hier mal ein Beispiel hochgeladen: https://github.com/gkuhl/pyradtran
Antworten