Ich mache ein Programm, das Code in Batches zufällig generiert und eine Eingabe gegeben, testet, ob dieser Code die gewünschte Ausgabe generiert. Ich möchte die Stapel generierten Codes ziemlich groß machen, sagen wir 10.000 zufällig generierte Dateien pro Batch, also möchte ich im Speicher arbeiten, anstatt sie mit dem Schreiben auf die Festplatte zu verschwenden. Ich möchte auch, dass der Compiler die ganze Arbeit für mich erledigt, wo die einmal erstellte Datei als ein Modul importiert wird, und dann die generierte Funktion in diesem Modul ausgeführt wird und das Ergebnis gegen die gewünschte Ausgabe getestet wird.Mounting Virtual Directory oder Ausführen von Code im Speicher für Python 3
Ich fand, dass Python tempfile.SpooledTemporaryFile() hat, mit dem ich ein dateiähnliches Objekt erstellen und bearbeiten kann, aber sobald ich es erstellt habe, möchte ich darauf zugreifen, als wäre es ein Python-Skript. Da die Datei jedoch im RAM ist und nach dem Schließen gelöscht wird, habe ich Schwierigkeiten, einen Weg zu finden. Was ich will so etwas wie dieses:
import os, tempfile, importlib, desiredInAndOut, codeGenerator
generatedCodeAsAString = codeGenerator.generateCode()
cwd = os.getcwd()
successfulCode = []
batchSize = int(input(Enter desired batch size:))
runs = 0
while runs < batchSize:
with tempfile.SpooledTemporaryFile(10240, 'w+b', None, None, '\n', '.py', 'tmp', cwd) as stf:
stf.write(generatedCodeAsAsAString.encode())
import tmp #import the newly generated file (that maybe has a 'shortcut' in the cwd? Somehow?)
importlib.invalidate_caches() #make sure the compiler knows that there is a new module for the first time this runs
importlib.reload(tmp) #if the compiler gets smart and re-uses the module from the first import/first iteration of this loop, make sure it reloads/updates it to match the new file that was just created
out = tmp.generatedFunction(desiredInAndOut.GIVEN_INPUT)
if out == desiredInAndOut.DESIRED_OUTPUT:
successfulCode.append(generatedCodeAsAString+'\n'+'#BATCHFILE NO '+str(runs))
runs += 1
print(successfulCode)
Trotz meiner Bemühungen ist die tmp-Datei in keiner Weise auf die aktuelle Arbeitsverzeichnis verknüpft, so dass der Import oben wird nicht funktionieren. Ich muss einen Weg finden, die Speicheradresse dieser temporären Datei an die import-Anweisung zu liefern, wo sie eine Standard-Datei "/foo/bar/tmp.py" erwarten würde, und stelle sicher, dass sie sie als Datei interpretiert.
Das Hinzufügen eines virtuellen Laufwerks direkt auf dem Computer ist aufgrund von Berechtigungsproblemen nicht möglich. Wenn Sie eine In-Python-Methode kennen, um so etwas ohne Administratorzugriff auf den Computer zu tun, bin ich ganz Ohr. Ich untersuche derzeit die Funktionalität der eingebauten Funktion exec - nicht sicher, wie es außerhalb der Shell reagieren wird. Ich hoffe, es wird funktionieren, aber wir werden sehen.
Gibt es einen richtigen/besseren Weg zu tun, was ich versuche? Genauer gesagt, gibt es eine Möglichkeit, den Compiler in die Richtung der im Speicher vorhandenen Datei zu lenken, so dass er manipuliert werden kann, als wäre er eine existierende Datei und/oder läuft er? Oder eine Python-formatierte Zeichenfolge, es muss nicht unbedingt eine Datei sein, wenn ich sie in Stringform ausführen kann.