Seite 1 von 1
Python in Python ausführen
Verfasst: Donnerstag 27. Mai 2021, 12:08
von tobi45f
Hallo zusammen,
der Titel wirkt recht seltsam und vermutlich ist es auch recht einfach.
Mein Programm erstellt ein ziemlich langen String mit vielen Befehlen, welcher dann als .py Datei abgespeichert wird. Im Anschluss würde ich gern diese .py Datei einmal ausführen.
Ich stehe auf dem Schlauch, wie ich nun diese Datei ausführen kann. Import und über den Aufruf geht ja nicht, da es zur Laufzeit erst generiert wird.
Gibt es ein Modul, mit dem ich das Skript einfach aufrufen kann?
Gruß Tobias
Re: Python in Python ausführen
Verfasst: Donnerstag 27. Mai 2021, 12:15
von Dennis89
Hallo,
ich kann dir dein Problem nicht lösen, mich würde aber der Hintergrund für das "Gewurschtel" interessieren. Warum machst du das so? Was für ein eigentliches Problem willst du damit lösen?
Eventuell gibt es eine Alternative dazu.
Grüße
Denniis
Re: Python in Python ausführen
Verfasst: Donnerstag 27. Mai 2021, 13:05
von tobi45f
Also es geht um Netzberechnung und die Erstellung eines Netzes in PandaPower (
https://pandapower.readthedocs.io/en/v2 ... s/bus.html)
Ich lese also die Datenbank des Quellsystems aus und forme es in das Zielformat um:
Code: Alles auswählen
panda_nodes = []
for n in nodes:
panda_nodes.append(f"bus{n[1]} = pp.create_bus(net, name = \"{n[0]}\", index = {n[1]}, vn_kv = {n[2]})
Wie man hier sieht weise ich die Knoten/den Bus einer Variale zu, welche ich später noch mal brauche (durch die Datenbankabfrage ist n[1] dieselbe ID wie bei l[2] oder eben l[3] - je nach dem):
Code: Alles auswählen
panda_lines = []
for l in lines:
panda_lines.append(f"line{l[0]} = pp.create_line_from_parameters(net, name = \"{l[18]}\", from_bus = bus{l[2]}, to_bus = bus{l[3]})
Aus diesem Grund habe ich mir meine Variablen hier mit meiner ID erzeugt und zugewiesen, damit die spätere Zuweisung passt. Schließlich ist auch die Zuordnung durch das Quellsystem schon gegeben, welche ich einfach übernehmen möchte, ohne mir Fehler einzufangen. Sprich ich gehe einfach Tabelle für Tabelle durch und konvertiere die Objekte wenn man so möchte.
Zum Schluss wird das Gesamtkonstrukt dann in einer .py Datei gespeichert.
Anschließend möchte einfach eine Berechnung etc. durchführen.
Wenn ich den Code auch ohne Zwischenspeicherung über den String beispielsweise irgendwie ausführen kann, dann auch gerne.

Re: Python in Python ausführen
Verfasst: Donnerstag 27. Mai 2021, 13:24
von __blackjack__
@tobi45f: Nichts daran ist jetzt eine Erklärung warum Du dafür so was komisches machen willst und nicht einfach normalen Code schreibst statt Code in Zeichenketten die dann erst ausgeführt werden sollen.
`n` und `l` (was in vielen Schriftarten `1` und `I` und eventuell noch `|` sehr ähnlich sieht) sind keine guten Namen. Und die magischen Indexzahlen sind auch nicht so gut verständlich. Zumindest bei den `nodes` kann man die Bestandteile schon im Schleifenkopf auf sprechendere Namen aufteilen.
Edit (ungetestet):
Code: Alles auswählen
...
index_to_bus = {
bus_index: pp.create_bus(net, name=name, index=bus_index, vn_kv=vn_kv)
for name, bus_index, vn_kv in nodes
}
index_to_line = {}
for line in lines:
line_index, _, from_bus_index, to_bus_index = line[:4]
name = line[18]
index_to_line[line_index] = pp.create_line_from_parameters(
net,
name=name,
from_bus=index_to_bus[from_bus_index],
to_bus=index_to_bus[to_bus_index],
)
...
Re: Python in Python ausführen
Verfasst: Donnerstag 27. Mai 2021, 14:24
von __blackjack__
@tobi45f: Ich habe mir die API von der Bibliothek mal angeschaut und `index_to_bus` beziehungsweise die ganzen `bus*`-Namen in Deinem Code machen keinen Sinn, denn `create_bus()` gibt genau den `index` den man übergeben hat, auch wieder zurück. Der Rückgabewert macht nur Sinn wenn man das `index`-Argument nicht übergibt und die Funktion selbst einen neuen Wert aussuchen würde.
Code: Alles auswählen
net = pp.create_empty_network()
...
for name, bus_index, vn_kv in nodes:
pp.create_bus(net, vn_kv, name, bus_index)
index_to_line = {}
for line in lines:
line_index, _, from_bus_index, to_bus_index = line[:4]
name = line[18]
#
# FIXME Hier fehlen 4 obligatorische Argumente beim Aufruf!
#
# TODO Sollte hier auch wie bei `create_bus` ein Wert für `index`
# übergeben werden, dann ist auch hier das Wörterbuch
# (`index_to_line`) überflüssig weil Inhalt nicht sinnvoll.
#
index_to_line[line_index] = pp.create_line_from_parameters(
net, from_bus_index, to_bus_index, ..., ..., ..., ..., name
)
...
Re: Python in Python ausführen
Verfasst: Freitag 28. Mai 2021, 12:45
von tobi45f
Vielen Dank für deine Ausführliche Hilfe!
Ich musste es erstmal implementieren und testen, bevor ich antworte
Aber die Lösung über dictionaries funktioniert! Vielen Dank für den Hinweis!
Ah okay, dass create_bus auch nur den übergebenen Index zurück gibt, wusste ich auch nicht. Bei den Beispielen wurden tatsächlich Variablen zugewiesen und später wieder verwendet für from_bus/to_bus. Wenn ich nur den Index brauche, macht es das natürlich denkbar einfach!
Und ja, bei meinem Beispiel fehlen Argumente - ich hab nur einen Teil kopiert, da es "nur" um das Prinzip ging. Wer geht denn davon aus, dass ihr hier so tiefgründig recherchiert
Vielen Dank!
Re: Python in Python ausführen
Verfasst: Samstag 29. Mai 2021, 08:18
von ThomasL
tobi45f hat geschrieben: Freitag 28. Mai 2021, 12:45
......Wer geht denn davon aus, dass ihr hier so tiefgründig recherchiert
Tja, sie machen das, was viele der Fragensteller im Vorfeld nicht machen..... no offense intended.
Aber selbst ich Noob konnte schon so manche Frage durch den ersten gezeigten Link einer Google Suche recherchieren und beantworten.