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

hxi*_*xin 9 pycharm

Python 3.4.2的Python控制台

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

def reloadtest(x):
    print("Version A: {}".format(x))
Run Code Online (Sandbox Code Playgroud)

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   
Run Code Online (Sandbox Code Playgroud)

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

ReloadTest.py:

def reloadtest(x):
    print("Version B: {}".format(x))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Mor*_*ken 23

可以在通过添加下列行来改变指示Pycharm自动重新加载模块settings- > Build,Excecution,Deployment- > Console- >Python ConsoleStarting Script

%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Update: This function requires IPython (pip install ipython) as described here: Reloading submodules in IPython

  • @MattR0se,也许 IPython 没有为你安装。您可以使用“pip install ipython”安装它吗 (3认同)
  • 这给我带来了语法错误。(我尝试了带和不带百分比符号)。 (2认同)

hxi*_*xin 12

让它工作!
相反from Module import function,我应该导入整个模块import Module,然后通过调用函数Module.function()。这是因为

from ReloadTest import reloadtest
Run Code Online (Sandbox Code Playgroud)

importlib.reload(ReloadTest)
Run Code Online (Sandbox Code Playgroud)

不能一起去。

>>> import ReloadTest
>>> ReloadTest.reloadtest(1)
Version A: 1
Run Code Online (Sandbox Code Playgroud)

进行更改后:

>>> importlib.reload(ReloadTest)
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'>
>>> ReloadTest.reloadtest(2)
Version B: 2
Run Code Online (Sandbox Code Playgroud)


Esk*_*app 10

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

你可以简单地做:

import importlib
importlib.reload(my_module)
from my_module import my_function
Run Code Online (Sandbox Code Playgroud)

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

适用于PyCharm Community Edition 2016.3.2

编辑第一条评论:这仅在您首次导入模块本身时才有效(否则您会收到第一条评论中所述的错误).

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
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 5

由于这个问题专门询问了 PyCharm,请查看PyCharm 支持网站上的答案。这个答案几乎与 @wokbot 的相同,区别在于 PyCharm 消除了import importlib. 如果您打算经常使用,它还使用了from ... import ...after 的技巧来使输入变得更容易。import ...reloadtest

In[2]: import ReloadTest
In[3]: from ReloadTest import reloadtest
In[4]: reloadtest(1)
Out[4]: Version A: 1
Run Code Online (Sandbox Code Playgroud)

...做出改变

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
Run Code Online (Sandbox Code Playgroud)

  • 使用 IPython,您可以使用 [autoreload](https://ipython.org/ipython-doc/3/config/extensions/autoreload.html),例如 `%load_ext autoreload` 和 `%autoreload 2` (4认同)