2016-05-06 12 views
1

So habe ich eine Python-Anwendung, die diese Funktionalität hat, wo modulähnliche Datei im Unterverzeichnis extensions des Programmverzeichnisses zu einem frühen Zeitpunkt in der Initialisierung der Anwendung importiert wird.Monkey Patch das Modul, das dieses ein importiert

Das sieht etwa so aus (nehme an, dies ist my_application.py):

def do_init(): 
    for thefname in glob.iglob(os.path.join(".","extensions","*")): 
     SourceFileLoader(os.path.basename(thefname),thefname).load_module() 
    #do other init stuff... 

if __name__ == "__main__": 
    do_init() 
    do_cool_things() 

Nun, ich möchte in der Lage sein, eine Py-Datei haben in dieser Erweiterungen Verzeichnis, das etwas geht:

import my_application 
def my_cool_things(): 
    print("The original things have been overridden.") 
my_application.do_cool_things = my_cool_things 

Und das funktioniert ... für zukünftige Importe von my_application. Aber der do_cool_things Anruf innerhalb der if __name__ == "__main__" Wache zeigt das ursprüngliche Verhalten. Warum passiert das und wie kann ich diesen Aufruf das modifizierte Verhalten zeigen lassen?

Antwort

1

Das durch das Ausführen eines Skripts namens my_application.py erstellte Modul ist überraschenderweise nicht my_application10. Das Modul, das durch Ausführen eines Skripts erstellt wird, lautet __main__. Natürlich würde das von erstellte Modul eine Datei namens my_application.pymy_application genannt werden.

Zwei Lösungen für Ihr Problem sind import my_application mit import __main__ oder import builtins zu ersetzen.

Einfache Demonstration:

#x.py 
import y 
print ("Hello", hello) 

und

#y.py 
import __main__ 
__main__.hello = 'world' 

-Test auf Ubuntu 14.04 mit Python 3.4.3:

$ python3 x.py 
Hello world 
$ 
+0

Das funktioniert! Und hier versuche ich, die Funktionen des Moduls zu erreichen, indem ich den Stapel durch die Import-Maschinen abwickle ...: P – Schilcote

Verwandte Themen