2011-01-12 3 views
4

jeder Komponententest, den ich ausführe, schreibt Python-Code in eine Datei und importiert sie dann als Modul. Das Problem ist, dass sich der Code ändert, aber weitere Importanweisungen das Modul nicht ändern.Gibt es sowieso Python-Bytecode-Cache zu löschen?

Ich denke, was ich brauche, ist eine Möglichkeit, Ether eine Neuladung auf einem Modul erzwingen oder den internen Bytecode-Cache löschen. Irgendwelche Ideen?

Danke!

Antwort

8

Erneutes Importieren von Modulen heikel ist Recht, alle Grenzfälle zu erhalten. Die Dokumentation für reload erwähnt einige von ihnen. Abhängig davon, was Sie testen, können Sie besser aus, indem Sie die Importe mit separaten Aufrufe des Interpreters durch Ausführen jeder via, sagen wir subprocess. Es wird wahrscheinlich langsamer, aber wahrscheinlich auch sicherer und genauer getestet werden.

+0

Mir gefiel diese Lösung am besten, weil sie erlaubt, die Tests mit verschiedenen Python-Interpretern zu machen und es ist viel sicherer (meine Tests funktionieren jetzt!) – Scott

4

Verwenden Sie reload().

Laden Sie ein zuvor importiertes Modul neu. Das Argument muss ein Modulobjekt sein, , daher muss es zuvor erfolgreich importiert worden sein. Dies ist nützlich, wenn Sie die Modulquellendatei mit einem externen Editor bearbeitet haben und die neue Version ohne ausprobieren möchten, den Python-Interpreter verlassend. Der Rückgabewert ist das Modulobjekt (das entspricht dem Modulargument).

Das Modul muss jedoch bereits geladen sein. Eine Abhilfe ist die resultierende NameError zu handhaben:

try: 
    reload(math) 
except NameError: 
    import math 
+0

Sie können das Reload jedoch nur für ein Modul verwenden, das bereits geladen wurde. Ich habe diesen Ansatz versucht, aber dir() listet mein Modul nicht als geladen – Scott

+0

@Scott Siehe meine Bearbeitung. – marcog

3

Schreiben Sie Ihren Code in unterschiedlich benannte Module. Neuen Code in eine vorhandene Datei schreiben und versuchen, sie erneut zu importieren, funktioniert nicht gut.

Alternativ können Sie Clobber sys.modules. Zum Beispiel:

class MyTestCase(unittest.TestCase): 
    def setUp(self): 
     # Record sys.modules here so we can restore it in tearDown. 
     self.old_modules = dict(sys.modules) 

    def tearDown(self): 
     # Remove any new modules imported during the test run. This lets us 
     # import the same source files for more than one test. 
     for m in [m for m in sys.modules if m not in self.old_modules]: 
      del sys.modules[m] 
0

Ran in eine ähnliche Situation. Später wurde festgestellt, dass die Weißraumeindrucktechnik von Bedeutung ist. Insbesondere auf Windows-Plattformen, stellen Sie sicher, dass eine einheitliche Technik im gesamten Modul angepasst ist, d. H. Entweder Tab oder Leerzeichen ausschließlich verwenden.

Verwandte Themen