2016-04-07 6 views
0

Ich habe eine Hauptdatei, die eine Klasse aus einer anderen Datei als solche importiert:Python-Modul-Update

from pybrain.rl.environments.HoldemTask import HoldemTask. 

Wenn ich HoldemTask.py ändern, werden die Änderungen nicht in der Hauptdatei reflektiert. Die einzige Problemumgehung, die ich gefunden habe, ist die Ausführung von Pybrains

Kann ich das Modul oder etwas neu laden? Reload() scheint nicht zu funktionieren.

Antwort

1

Zunächst einmal: python setup.py install macht in der Regel eine Kopie des Codes es installiert wird, also, wenn Sie finden, dass Sie ausführen müssen, dass vor Änderungen wirksam werden, stehen die Chancen, dass für die Entwicklung sollten Sie Ihren PYTHONPATH oder sys.path so werden eingestellt dass Ihre relevanten Importe direkt aus der Quellstruktur und nicht aus der Python-Site-Paketbibliothek stammen. Sie können schnell überprüfen, die Code-Datei, indem sie diese auf der Oberseite der Hauptdatei importiert, wenn Sie es ausführen:

from pybrain.rl.environments import HoldemTask # module object, not class 
print(HoldemTask.__file__) 

im allgemeinen Zweitens: Es ist viel besser, einen Python-Prozess neu zu starten, wenn der Code Änderungen vornehmen zu sicherstellen, dass sie in Kraft treten. Wenn Sie wirklich Änderungen ohne Neustart benötigen, lesen Sie weiter.

Das erneute Laden eines Moduls in Python wirkt sich nur auf zukünftige Importe aus. Damit ein Reload in Arbeit ist, müssen Sie das importierte Klassenobjekt nach dem Neuladen ersetzen. Zum Beispiel im Rahmen der „Hauptdatei“ Ausführen der Import Sie aufgelistet (innerhalb einer Klassenmethode oder Funktion ist in Ordnung):

# we need a module object to reload(), not the class inside it 
from import pybrain.rl.environments import HoldemTask as HoldemTask_module 
reload(HoldemTask_module) 
# we then need to replace the old class object with the reloaded one 
# in the main file's module-wide (aka "global") namespace 
global HoldemTask 
HoldemTask = HoldemTask_module.HoldemTask 

Ein letzter Nachteil dabei ist, dass alle vorhandenen HoldemTask Objekte verwenden, wird auch weiterhin die alter Code, weil sie in sich einen Verweis auf das Pre-Reload-Klassenobjekt einbetten. Die einzige Möglichkeit, ein In-Prozess-Reload zu vervollständigen, besteht darin, dass der Code spezifisch geschrieben wird, um jede Instanz von allem, was er gemacht hat, auf der Grundlage des ursprünglichen Moduls wegzuwerfen.

+0

Danke! Ich habe gerade meinen PYTHONPATH geändert und die Dateien in einen neuen Ordner gelegt. –