2013-01-24 11 views
6

Ich möchte in der Lage sein, eine Python-Shell zu öffnen, in einem Modul definierten Code auszuführen, das Modul zu ändern und es dann erneut auszuführen in der gleichen Hülle ohne zu schließen/wieder zu öffnen.Code aus einem Python-Modul ausführen, Modul ändern und dann erneut ausführen, ohne interpeter zu beenden

Ich habe versucht, die Funktionen/Objekte neu zu importieren, nachdem das Skript ändern, und das nicht funktioniert:

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from my_module import buggy_function, test_input 
>>> buggy_function(test_input) 
wrong_value # Returns incorrect result 

# Go to the editor, make some changes to the code and save them 

# Thought reimporting might get the new version 
>>> from my_module import buggy_function, test_input 

>>> buggy_function(test_input) 
wrong_value # Returns the same incorrect result 

Klar reimporting habe mich nicht die ‚neue Version‘ der Funktion.

In diesem Fall ist es nicht so schlimm, den Interpreter zu schließen und wieder zu öffnen. Aber wenn der Code, den ich teste, kompliziert genug ist, muss ich manchmal eine Menge Objekte importieren und Dummy-Variablen definieren, um einen Kontext zu erstellen, der den Code angemessen testen kann. Es wird nervig, dies jedes Mal machen zu müssen, wenn ich etwas ändere.

Wer weiß, wie man den Modulcode innerhalb des Python-Interpeters "auffrischt"?

+1

Sie können jederzeit ein Modul schreiben, das alles definiert Dummy-Variablen importiert, usw., und dann jedes Mal den Interpreter wieder öffnen, die Sie gerade 'von testsetup import *' bekommen die right context (oder 'python -i test setup.py' statt nur' python'). – abarnert

Antwort

9

Verwendung imp.reload():

In [1]: import imp 

In [2]: print imp.reload.__doc__ 
reload(module) -> module 

Reload the module. The module must have been successfully imported before. 
+0

reload() ist auch im globalen Namespace verfügbar, ohne dass imp importiert werden muss. –

+0

@LieRyan nur in py2x. –

Verwandte Themen