2016-07-05 6 views
5

Ich habe ein Modul, das ich importieren und bestimmte Variablenwerte in der importierten Instanz dieses Moduls ändern und dann ausführen muss.Wie man ein Modul importiert und einen Variablenwert innerhalb des Moduls ändert und ausführt

Bitte beachten Sie, dass ich kann keine einzige Änderung an dem Modul aus alten Gründen zu importieren. Hier

ist das, was ich zu tun versucht:

sagen das Modul i importieren möchten, a.py, sieht aus wie

var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

Jetzt habe ich dies in b.py bin importieren, um den Anrufer Skript. Ich versuche, es zu importieren, ändere Wert von Variable var1 und führe es als Hauptprogramm mit runpy wie folgt aus.

import runpy 
import a 

a.var1 = 2 
result = runpy._run_module_as_main(a.__name__) 

Aber diese druckt das Ergebnis als 3 nur und nicht so 4 wie erwartet.

Jeder andere Weg, um dies zu erreichen (abgesehen von runpy verwenden), ohne etwas in a.py zu ändern? Offen für jedes Modul von Drittanbietern, wenn ich keine Änderungen an dem importierten Modul vornehmen muss.

ich verwende Python 2.6

+1

Wenn Sie * wirklich * dies tun möchten, werden Sie das 'ast' Modul benötigen, glaube ich. –

+0

@WayneWerner bitte lassen Sie mich wissen, wie – MohitC

+0

Sie * wirklich * sollte dies nicht tun und nur eine Klasse statt. –

Antwort

3

Hier ist eine konkrete Umsetzung dessen, was ich in den Kommentaren vorgeschlagen:

#File temp.py 
var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

ich es über eine andere Datei run.py. Aufruf bin Der Schlüssel ist, eine andere dict Klasse zu haben, die immun gegen alle Änderungen an den Variablen ist, die das Modul beim Importieren/Ausführen ändern könnte. Dieses Wörterbuch enthält die Variablen, deren Wert Sie ändern möchten.

#File: run.py 
class UpdatedDict(dict): 
    def __setitem__(self, key, value): 
     if key != "var1": 
      super(UpdatedDict, self).__setitem__(key, value) 

u = UpdatedDict({"var1": 10, '__name__': '__main__'}) 
exec open("temp.py").read() in u #u here is the globals() for the module. 

Ausgabe

~/Temp$ python run.py 
12 #Yay! 

Hinweis: Dies ist eine schnelle und schmutzige Umsetzung und soll nur Ihnen den Weg zeigen Sie es tun können. Ich würde vorschlagen, durch runpy gehen und diesen Code robuster aussehen lassen. So wie es jetzt steht, ist es eine richtige Definition von hackish

+0

Das ist ausgezeichnet! Vielen Dank dafür. :) Sie haben meine 2 Tage wahrscheinlich gespeichert, weil Sie alle Legacy-Scripts durchgehen und erforderliche Änderungen an ihnen vornehmen müssen, ohne den Rest der Architektur zu zerstören. – MohitC

+0

Während dies funktioniert, wird jede Arbeit, die dadurch eingespart wird, wahrscheinlich durch die zusätzliche Arbeit aufgewogen, die erzeugt wird, wenn Leute damit umgehen müssen. Es erzeugt eine extrem enge, nicht lokale Kopplung, die durch das Lesen des geänderten Codes nicht erkannt werden kann, wodurch es noch schwieriger wird, einen Teil dieses Systems zu ändern. Die Leute werden so verdammt verwirrt sein, wenn ihre Anweisungen ignoriert werden. – user2357112

+0

@ user2357112 Konnte nicht mehr zustimmen! Ich hoffe, das OP wird erkennen, was Sie gerade gesagt haben. – SuperSaiyan

Verwandte Themen