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)
给我错误。重新加载测试.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
您可以通过将以下行添加到
Settings
中的 Build, Execution, Deployment
->Console
->Python Console
->Starting script
来指示 Pycharm 在更改时自动重新加载模块:
%load_ext autoreload
%autoreload 2
更新:此函数需要 IPython (
pip install ipython
),如下所述:在 IPython 中重新加载子模块
我花了一些时间来理解前面的答案...而且,如果您需要运行的代码块位于脚本中间,而您不想修改它来运行一次,那么这个答案就不是很实用.
你可以简单地做:
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
让它发挥作用!
我应该导入整个模块
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
由于这个问题专门询问了 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