2015-10-24 13 views
5

Python-Konsole mit Python 3.4.2Wie lade ich ein Modul nach dem Ändern neu?

I definiert eine Funktion in einem Modul, das in PyCharm Community Edition 4.5.4 richtig in Python-Konsole läuft:
ReloadTest.py:

def reloadtest(x): 
    print("Version A: {}".format(x)) 

Python-Konsole:

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 

Nachdem ich die Funktion „Version B“ geändert, PyCharm kann die Änderung nicht finden, und importlib.reload(ReloadTest) gibt mir Fehler.
Ich muss die Python-Konsole neu laden oder PyCharm jedes Mal neu starten, wenn ich ein Modul modifiziere. Was habe ich falsch gemacht? Was ist der beste Weg, damit umzugehen?

ReloadTest.py:

def reloadtest(x): 
    print("Version B: {}".format(x)) 

Python Konsole:

>>> reloadtest(1) 
Version A: 1 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 
>>> import importlib 
>>> importlib.reload(ReloadTest) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
NameError: name 'ReloadTest' is not defined 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 
>>> import ReloadTest 
>>> reloadtest(1) 
Version A: 1 
+0

Verwenden IPython und seine [Autonachlademode] (https://ipython.org/ipython-doc/3/config/extensions/autoreload.html) -Funktion. :) –

Antwort

2

Holen Sie es an die Arbeit!
Anstatt from Module import function sollte ich das gesamte Modul import Module importieren, dann rufen Sie die Funktion von Module.function(). Dies liegt daran,

from ReloadTest import reloadtest 

und

importlib.reload(ReloadTest) 

nicht zusammen gehen können.

>>> import ReloadTest 
>>> ReloadTest.reloadtest(1) 
Version A: 1 

Nachdem Sie die Änderungen:

>>> importlib.reload(ReloadTest) 
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'> 
>>> ReloadTest.reloadtest(2) 
Version B: 2 
2

ich mir etwas Zeit nahm die vorherige Antwort zu verstehen ... Und auch, ist diese Antwort nicht sehr praktisch, wenn das Futter der Code, den Sie ausführen müssen, ist In der Mitte eines Skripts, für das Sie keine Änderungen vornehmen möchten, um es einmal auszuführen.

Sie können einfach tun:

import importlib 
importlib.reload(my_module) 
from my_module import my_function 

Dann können Sie Ihren Code mit der aktualisierten Version der Funktion ausgeführt werden.

Arbeiten mit PyCharm Community Edition 2016.03.02

bearbeiten w.r.t. erster Kommentar: Das funktioniert nur, wenn Sie das Modul zuerst selbst importiert haben (sonst erhalten Sie einen Fehler wie im ersten Kommentar).

import my_module 
from my_module import my_function 
# Now calls a first version of the function 
# Then you change the function 
import importlib 
importlib.reload(my_module) 
from my_module import my_function 
# Now calls the new version of the function 
+1

Ihre Antwort ist genau das gleiche wie meine ursprüngliche Frage, die einen NameError verursacht und es nicht funktioniert. Jetzt habe ich es mit der PyCharm Community Edition 2016.3.3 erneut versucht, es ist immer noch genau so wie zuvor. Ich frage mich, was mich von deinem unterscheidet. – wokbot

+0

@armlet Tatsächlich habe ich vergessen zu erwähnen, dass dies nur funktioniert, wenn Sie das Modul zuerst importieren, damit sein Name definiert wird. Ich habe meine Antwort bearbeitet :) – Eskapp

+1

Angesichts meiner besseren Kenntnis von Python jetzt, ist Ihre erste Antwort ähnlich wie meine, aber zu dieser Zeit brauchte ich einige Zeit, um es tatsächlich zum Laufen zu bringen. Also werde ich diese Antwort hier für neue Benutzer wie ich hinterlassen, die vielleicht verwirrt werden, wenn ihre modifizierte Funktion an vielen Stellen in ihrem Code aufgerufen wird, und wenn sie ihren Aufruf mit den Funktionsnamen direkt gemacht haben. – Eskapp

0

Da diese Frage speziell über PyCharm gefragt, bitte auf den PyCharm Support site die Antwort überprüfen. Diese Antwort ist fast identisch mit @ wokbot, die Unterscheidung ist, dass PyCharm die Notwendigkeit, import importlib entfernt. Es verwendet auch den from ... import ... Trick nach import ..., um die Eingabe zu erleichtern, wenn Sie vorhaben, häufig reloadtest zu verwenden.

In[2]: import ReloadTest 
In[3]: from ReloadTest import reloadtest 
In[4]: reloadtest(1) 
Out[4]: Version A: 1 

...Änderungen

In[5]: reload(ReloadTest) 
Out[5]: <module 'ReloadTest' from 'C:\\...\\ReloadTest.py'> 
In[6]: from ReloadTest import reloadtest 
In[7] reloadtest(2) 
Out[7]Version B: 2 
Verwandte Themen