2015-10-24 12 views
5

Python Console z Python 3.4.2Jak ponownie załadować moduł po zmianie?

zdefiniowałem funkcję w module który działa poprawnie w konsoli Pythona w pycharm Community Edition 4.5.4:
ReloadTest.py:

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

Pythona konsoli:

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 

Po zmodyfikowano funkcję na „wersja B”, pycharm nie można znaleźć zmiany i importlib.reload(ReloadTest) daje mi błąd.
Muszę przeładować konsolę Pythona lub zrestartować PyCharm za każdym razem, gdy modyfikuję moduł. Co zrobiłem źle? Jaki jest najlepszy sposób, aby sobie z tym poradzić?

ReloadTest.py:

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

Python Console:

>>> 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

Używaj ipython i funkcji jej [AutoReload] (https://ipython.org/ipython-doc/3/config/extensions/autoreload.html). :) –

Odpowiedz

2

zmusić go do pracy!
Zamiast from Module import function, powinienem zaimportować cały moduł import Module, a następnie wywołać funkcję przez Module.function(). To dlatego

from ReloadTest import reloadtest 

i

importlib.reload(ReloadTest) 

nie mogą iść w parze.

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

Po dokonaniu zmian:

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

I zajęło mi trochę czasu, aby zrozumieć poprzednią odpowiedź ... A także, że odpowiedź nie jest bardzo praktyczny, gdy Chuck kodu trzeba uruchomić to w środku skryptu, który nie ma ochoty modyfikować, aby uruchomić go raz.

Można po prostu zrobić:

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

Następnie można uruchomić kod z zaktualizowanej wersji funkcji.

Działa z pycharm Community Edition 2.3.2016

Edit w.r.t. pierwszy komentarz: Działa to tylko wtedy, gdy najpierw zaimportowano sam moduł (w przeciwnym razie pojawi się błąd, jak podano w pierwszym komentarzu).

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

Twoja odpowiedź jest dokładnie taka sama, jak mówi moje oryginalne pytanie, co powoduje błąd NameError i nie działa. Teraz próbowałem ponownie z PyCharm Community Edition 2016.3.3, nadal jest dokładnie tak, jak było wcześniej. Zastanawiam się, co moje różni się od twojego. – wokbot

+0

@armlet Rzeczywiście, zapomniałem wspomnieć, że działa to tylko wtedy, gdy najpierw zaimportujesz moduł, aby zdefiniować jego nazwę. Edytowałem swoją odpowiedź :) – Eskapp

+1

W świetle mojej lepszej znajomości Pythona, twoja pierwsza odpowiedź jest podobna do mojej, jednak w tamtym czasie zajęło mi trochę czasu, aby to zadziałało. Tak więc zostawię tę odpowiedź tutaj dla nowych użytkowników, takich jak ja, którzy mogą się zdezorientować, jak to zrobić, jeśli ich zmodyfikowana funkcja jest wywoływana w wielu miejscach w ich kodzie, i czy wykonali połączenie z nazwami funkcji bezpośrednio. – Eskapp

0

Od tego pytanie zadane konkretnie o pycharm, proszę sprawdzić odpowiedź na PyCharm Support site. Ta odpowiedź jest prawie identyczna jak w przypadku @ wokbota, rozróżnienie polega na tym, że PyCharm usuwa potrzebę import importlib. Używa również podstępu from ... import ... po import ..., aby ułatwić pisanie, jeśli planujesz często używać reloadtest.

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

...dokonać zmiany

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