exec mit komplett neuem Namensraum

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
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hallo,

da ich Schwierigkeiten habe das Problem in einen Text zu verfassen, hier ein bisschen Code:

Code: Alles auswählen

import sys

print(sys.path)

CODE = '''import sys

sys.path.remove('/usr/lib/python3.2/site-packages')
'''
exec(CODE, {}, {})

print(sys.path)

Code: Alles auswählen

... '/usr/lib/python3.2/plat-linux2', '/usr/lib/python3.2/lib-dynload', '/usr/lib/python3.2/site-packages']
... '/usr/lib/python3.2/plat-linux2', '/usr/lib/python3.2/lib-dynload']
Ich möchte aber quasi einen komplett neuen Namensraum, sodass /usr/lib/python3.2/site-packages am Ende noch in sys.path ist und nur für den ausgeführten Code entfernt wird.

Brauchen tue ich das, weil ich diese Idee ein bisschen ausbauen möchte, jedoch möchte ich nicht, dass sich etwas im Hauptprogramm verändern lässt, außer ich übergebe es explizit als Globale-Variable an exec.
Ich hoffe Ihr könnt mir da weiterhelfen oder ist das überhaupt unmöglich, ohne einen neuen Interpreter-Prozess zu starten?

Viele Grüße
Maxi
BlackJack

@maxi_king_333: Ohne eigenen, abgeschotteten Interpreter geht das nicht. Es gibt so viele Wege an Objekte zu kommen. Neben so offensichtlichen wie sich von `gc.get_objects()` mal eben alle für den Müllsammler erreichbaren Objekte geben zu lassen über das traversieren des Aufrufstapels mit dem `inspect`-Modul bis zu eher obskuren Wegen.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Ja, genau, das ist mir bewusst und genau diese ganzen Übergriffe möchte ich nicht - sys.path, war nur ein Beispiel...
Ich möchte also quasi einen komplett neuen abgeschotteten Namensraum, wenn das nur mit einer neuen Interpreter Instanz geht, bleibt die Frage, wie mache ich das am Besten?
Ich habe zum Beispiel Objekte mit Methoden zum senden von HTTP Headern, was den konkreten Anwendungsfall angeht, diese sollen aus der neuen Instanz aufrufbar sein.
Nach Möglichkeit will ich da aber keinen riesigen IPC Overhead haben.
Wie würdest man sowas am geschicktesten Lösen, mit minimalem Overhead, ich möchte ja nicht, dass eine Seite 3 Stunden zum laden braucht?
deets

Ohne IPC geht's nicht - und mit Verlaub: wenn wir hier ueber einen Webserver/framework (nicht, dass es da nicht schon welche gaebe, aber Raeder erfinden scheint Spass zu machen) reden, dann hast du da mit Latenzen zu deinem Client im 100te ms und mehr Bereich zu rechnen. Da faellt das bisschen IPC *null* auf. ZB ist ein klassisches Szenario von NGINX/Apache als reverse Proxy & dahinter eine Webapp ja schon prinzipiell IPC. Und ein gaengiges Szenario, welches ueblicherweise die Requests sogar beschleunigt, weil es den network stream des app-servers von dem zum client entkoppelt.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Danke für eure Antworten, dann werde ich mal ein bisschen mit IPC rumspielen (dachte irgendwie immer, das würde sich mehr bemerkbar machen ;) ).

Zu der Sache mit den Rädern:
Wenn ich eine Webseite erstellen wollte, dann würde ich ein vorgefertigtes nehmen.
Aber ich möchte halt mal Probieren, wie sich so ein Framework selber gestalten lässt.
Antworten