更改后如何重新加载模块?
How do I reload a module after changing it?
Python 控制台 Python 3.4.2
我在 PyCharm 社区版 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
我把函数改成"Version 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
让它开始工作!
我应该导入整个模块 import Module
,而不是 from Module import function
,然后通过 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
我花了一些时间来理解之前的答案...而且,如果您需要 运行 的代码夹在您执行的脚本中间,那么该答案不是很实用不想为 运行 修改一次。
你可以简单地做:
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
由于这个问题专门针对 PyCharm 提出的,请查看 PyCharm Support site 上的答案。这个答案几乎与@wokbot 的答案相同,区别在于 PyCharm 不再需要 import importlib
。如果您打算经常使用 reloadtest
,它还会在 import ...
之后使用 from ... import ...
技巧来简化打字。
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
您可以通过将以下行添加到 settings
->Build,Excecution,Deployment
->Console
->[=14= 来指示 Pycharm 在更改时自动重新加载模块] 在 Starting Script
:
%load_ext autoreload
%autoreload 2
更新:此函数需要 IPython (pip install ipython
),如下所述:Reloading submodules in IPython
Python 控制台 Python 3.4.2
我在 PyCharm 社区版 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
我把函数改成"Version 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
让它开始工作!
我应该导入整个模块 import Module
,而不是 from Module import function
,然后通过 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
我花了一些时间来理解之前的答案...而且,如果您需要 运行 的代码夹在您执行的脚本中间,那么该答案不是很实用不想为 运行 修改一次。
你可以简单地做:
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
由于这个问题专门针对 PyCharm 提出的,请查看 PyCharm Support site 上的答案。这个答案几乎与@wokbot 的答案相同,区别在于 PyCharm 不再需要 import importlib
。如果您打算经常使用 reloadtest
,它还会在 import ...
之后使用 from ... import ...
技巧来简化打字。
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
您可以通过将以下行添加到 settings
->Build,Excecution,Deployment
->Console
->[=14= 来指示 Pycharm 在更改时自动重新加载模块] 在 Starting Script
:
%load_ext autoreload
%autoreload 2
更新:此函数需要 IPython (pip install ipython
),如下所述:Reloading submodules in IPython