2015-10-24 2 views
5

Консоль Python с Python 3.4.2Как перезагрузить модуль после его изменения?

Я определил функцию в модуле, который работает правильно в консоли Python в PyCharm Community Edition 4.5.4:
ReloadTest.py:

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

Python консоли:

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 

После того как я изменил функцию «Version B», PyCharm не может найти замену, и importlib.reload(ReloadTest) дает мне ошибку.
Я должен перезагрузить консоль Python или перезапустить PyCharm при каждом изменении модуля. Что я сделал не так? Каков наилучший способ справиться с этим?

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

Используйте IPython и его функции [автоперезагрузки] (https://ipython.org/ipython-doc/3/config/extensions/autoreload.html). :) –

ответ

2

Получить его на работу!
Вместо from Module import function, я должен импортировать весь модуль import Module, а затем вызвать функцию по Module.function(). Это происходит потому, что

from ReloadTest import reloadtest 

и

importlib.reload(ReloadTest) 

не могут идти вместе.

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

После внесения изменений:

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

Я взял меня некоторое время, чтобы понять предыдущий ответ ... А также, что ответ не очень практично, если патрон кода, который нужно запустить, в середине скрипта, который вам не нравится изменять для его запуска один раз.

Вы можете просто сделать:

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

Затем вы можете запустить свой код с обновленной версией функции.

Работает с PyCharm Community Edition 2016.3.2

Редактировать w.r.t. первый комментарий: Это работает, только если вы сначала импортировали сам модуль (иначе вы получите сообщение об ошибке, как сказано в первом комментарии).

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

Ваш ответ точно такой же, как и в моем первоначальном вопросе, который вызывает NameError, и он не работает. Теперь я снова попытался с PyCharm Community Edition 2016.3.3, он по-прежнему так же, как и раньше. Мне интересно, что отличает меня от твоего. – wokbot

+0

@armlet Действительно, я забыл упомянуть, что это работает, только если вы сначала импортируете модуль, чтобы его имя было определено. Я отредактировал свой ответ :) – Eskapp

+1

В свете моих лучших знаний о Python теперь ваш первый ответ похож на мой, однако в то время мне потребовалось некоторое время, чтобы заставить его работать. Итак, я оставлю этот ответ для новых пользователей, таких как я, которые могут запутаться в том, как это сделать, если их измененная функция вызывается во многих местах в их коде, и если они сделали свой вызов с именами функций напрямую. – Eskapp

0

Поскольку этот вопрос, заданный конкретно о PyCharm, пожалуйста, проверьте ответ на PyCharm Support site. Этот ответ почти идентичен @ wokbot's, отличие состоит в том, что PyCharm устраняет необходимость в import importlib. Он также использует трюк from ... import ... после import ..., чтобы упростить ввод текста, если вы планируете часто использовать reloadtest.

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

...сделать изменения

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 
Смежные вопросы