Python in Python ausführen

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
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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. ;)
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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],
        )
    ...
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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
        )
    ...
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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!
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten