更改模块后如何重新加载模块?

时间:2015-10-24 21:44:40

标签: pycharm

使用Python 3.4.2的Python控制台

我在PyCharm Community Edition 4.5.4中的Python控制台中正确运行的模块中定义了一个函数:
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   

将功能修改为"版本B"后,PyCharm无法找到更改,importlib.reload(ReloadTest)给我错误。
我每次修改模块时都必须重新加载Python控制台或重启PyCharm。我做错了什么?处理这个问题的最佳方法是什么?

ReloadTest.py:

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

Python控制台:

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

4 个答案:

答案 0 :(得分:14)

您可以指示Pycharm在更改后自动重新加载模块,方法是将以下行添加到{{1}中的settings-> Build,Excecution,Deployment-> Console-> Python Console }}:

Starting Script

enter image description here

此函数来自IPython,如下所述:Reloading submodules in IPython

答案 1 :(得分:6)

我花了一些时间来理解之前的答案......而且,如果您需要运行的代码块位于脚本的中间,而您不想修改为运行,那么这个答案并不是很实用它一次。

您可以这样做:

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

答案 2 :(得分:4)

让它开始工作!
我应该导入整个模块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

答案 3 :(得分:2)

由于这个问题专门询问了PyCharm,请查看PyCharm Support site上的答案。这个答案几乎与@ wokbot相同,区别在于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