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

问题描述 投票:0回答:4

Python 控制台与 Python 3.4.2

我在 PyCharm Community Edition 4.5.4 的 Python 控制台中正确运行的模块中定义了一个函数:
重新加载测试.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。我做错了什么?处理这个问题的最佳方法是什么?

重新加载测试.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
pycharm
4个回答
43
投票

您可以通过将以下行添加到

Settings
中的
Build, Execution, Deployment
->
Console
->
Python Console
->
Starting script
来指示 Pycharm 在更改时自动重新加载模块:

%load_ext autoreload
%autoreload 2

更新:此函数需要 IPython (

pip install ipython
),如下所述:在 IPython 中重新加载子模块


34
投票

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

你可以简单地做:

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

然后,您可以使用该函数的更新版本运行您的代码。

适用于 PyCharm 社区版 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

12
投票

让它发挥作用!
我应该导入整个模块

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

5
投票

由于这个问题专门询问了 PyCharm,请查看 PyCharm 支持网站上的答案。这个答案几乎与 @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
© www.soinside.com 2019 - 2024. All rights reserved.