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

Pycharm 更改模块后如何重新加载模块?,pycharm,Pycharm,使用Python 3.4.2的Python控制台 我在PyCharm Community Edition 4.5.4的Python控制台中定义了一个模块中的函数: ReloadTest.py: def reloadtest(x): print("Version A: {}".format(x)) def reloadtest(x): print("Version B: {}".format(x)) Python控制台: Python 3.4.2 (v3.4.2:ab2c023

使用Python 3.4.2的Python控制台

我在PyCharm Community Edition 4.5.4的Python控制台中定义了一个模块中的函数:
ReloadTest.py:

def reloadtest(x):
    print("Version A: {}".format(x))
def reloadtest(x):
    print("Version B: {}".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   
>>> 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
在我将函数修改为“版本B”后,PyCharm找不到更改,并且
importlib.reload(ReloadTest)
给了我错误信息。
每次修改模块时,我都必须重新加载Python控制台或重新启动PyCharm。我做错了什么?处理这个问题的最佳方法是什么

ReloadTest.py:

def reloadtest(x):
    print("Version A: {}".format(x))
def reloadtest(x):
    print("Version B: {}".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   
>>> 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
>>重新加载测试(1)
版本A:1
>>>从重新加载测试导入重新加载测试
>>>重新加载测试(1)
版本A:1
>>>导入导入库
>>>导入库重新加载(重新加载测试)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“重新加载测试”
>>>从重新加载测试导入重新加载测试
>>>重新加载测试(1)
版本A:1
>>>导入重新加载测试
>>>重新加载测试(1)
版本A:1
让它开始工作
我应该导入整个模块,而不是从模块导入函数中导入
,然后通过
Module.function()
调用该函数。这是因为

from ReloadTest import reloadtest

不能一起去

>>> import ReloadTest
>>> ReloadTest.reloadtest(1)
Version A: 1
更改后:

>>> importlib.reload(ReloadTest)
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'>
>>> ReloadTest.reloadtest(2)
Version B: 2
导入lib.reload(重新加载测试) >>>重新加载测试。重新加载测试(2) 版本B:2
我花了一些时间来理解前面的答案。。。而且,如果你需要运行的代码夹在脚本的中间,你不想修改它运行一次,那么这个答案就不太实用了。 您可以简单地执行以下操作:

import importlib
importlib.reload(my_module)
from my_module import my_function
然后,可以使用更新版本的函数运行代码

与PyCharm社区版2016.3.2合作

编辑w.r.t.第一条评论: 这仅在您首先导入模块本身时有效(否则会出现错误,如第一条注释所述)


由于这个问题是专门针对PyCharm提出的,请查看网页上的答案。这个答案与@wokbot的答案几乎相同,区别在于PyCharm不再需要
导入importlib
。它还使用来自。。。导入…导入…后的技巧,如果您计划频繁使用
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
[5]中的
:重新加载(重新加载测试)
出[5]:
在[6]中:从重新加载测试导入重新加载测试
[7]中的重新加载测试(2)
Out[7]版本B:2

您可以通过在
启动脚本中的
设置
->
构建、执行、部署
->
控制台
->
Python控制台
中添加以下行,指示Pycharm在更改时自动重新加载模块:

%load_ext autoreload
%autoreload 2


更新:此功能需要IPython(
pip install IPython
),如下所述:

您的答案与我原来的问题完全相同,这会导致名称错误,无法正常工作。现在我再次尝试使用PyCharm社区版2016.3.3,它仍然与以前完全一样。我想知道是什么使我的和你的不同。@armlet事实上,我忘了提到,只有当你首先导入模块,以便定义其名称时,这才有效。我编辑了我的答案:)鉴于我现在对Python有了更深入的了解,您的第一个答案与我的答案类似,但在当时,我花了一些时间才真正让它工作起来。因此,我将把这个答案留给像我这样的新用户,他们可能会对如何在代码中的许多地方调用他们修改过的函数,以及如果他们直接使用函数名进行调用感到困惑。请使用IPython及其函数。:)有了IPython,您可以使用,例如,
%load\u ext autoreload
%autoreload 2
@vczm:由于您可以在PyCharm中使用IPython控制台,您的评论将是问题的完美答案。请考虑用它写一个答案,这给了我一个语法错误。(我尝试了使用和不使用百分比符号)。对我来说(PyCharm版本2019.3.1,Python版本3.8)@MattR0se,也许IPython不是为您安装的。你能用
pip install ipython安装它吗?
@MorrisFranken谢谢,这就是我所缺少的。我被所有的函数“重载”和模块名中的“重载”弄糊涂了,但是对于同样感到困惑的人,你应该先从importlib导入重载函数,然后再重新加载(你的模块名)