在交互时重新导入python中的模块

Ste*_*ini 330 python

我知道它可以做到,但我永远不会记得如何.

如何在python中重新导入模块?方案如下:我以交互方式导入模块并修改它,但后来我遇到了错误.我修复.py文件中的错误然后我想重新导入修复模块而不退出python.我该怎么做 ?

Ben*_*end 320

这应该工作:

reload(my.module)
Run Code Online (Sandbox Code Playgroud)

来自Python文档

重新加载以前导入的模块.参数必须是模块对象,因此必须先成功导入.如果您使用外部编辑器编辑了模块源文件并希望在不离开Python解释器的情况下试用新版本,这将非常有用.

如果运行Python 3.4及更高版本,请import importlib执行importlib.reload(nameOfModule).

不要忘记使用此方法的注意事项:

  • 重新加载模块时,将保留其字典(包含模块的全局变量).名称的重新定义将覆盖旧的定义,因此这通常不是问题.如果新版本的模块未定义旧版本定义的名称,则旧定义仍然存在.

  • 如果模块使用另一个模块导入对象from ... import ...,则调用reload()另一个模块不会重新定义从其导入的对象 - 一种方法是重新执行from语句,另一种方法是使用import和限定名称(module.*name*).

  • 如果模块实例化类的实例,则重新加载定义类的模块不会影响实例的方法定义 - 它们继续使用旧的类定义.派生类也是如此.

  • **不要忘记使用此方法的注意事项**:重新加载模块时,其字典(包含模块的全局变量)**将被保留**.名称的重新定义将覆盖旧的定义,因此这通常不是问题.如果新版本的模块未定义旧版本定义的名称,则旧定义仍然存在. (54认同)
  • **不要忘记使用这种方法的注意事项**:如果一个模块使用`from ... import ...`从另一个模块导入对象,则为另一个模块**调用`reload()`不会重新定义从它导入的对象** - 一种方法是重新执行`from`语句,另一种方法是使用`import`和限定名(`module.*name*`). (51认同)
  • **不要忘记使用此方法的注意事项**:如果模块实例化类的实例,则重新加载定义类**的模块不会影响实例的方法定义** - 它们继续使用*old*类定义**.派生类也是如此. (46认同)
  • **那些运行Python 3.4及以上版本的人请查看funky-future的答案.**执行`import importlib`,然后执行`importlib.reload(nameOfModule)`. (44认同)
  • 如果我使用`from filename import*`加载我的模块.怎么重装? (21认同)
  • @PeterZhu 对于“from mod import fcn”情况,模块对象未添加到名称空间。因此您需要显式导入模块,以便稍后重新加载它。`进口富; 从 foo 导入栏;重新加载(foo)` (6认同)
  • 如果您按照“import mod as name”导入函数,那么您需要执行以下操作:'import importlib importlib.reload(name)' (5认同)
  • 我尝试了重新加载以及自动重新加载魔法,并且我看到我的代码更改反映在错误消息的堆栈中,但错误本身似乎仍然脱离了过时的代码(例如,错误行位于完全相同的行上)像以前一样的行,我已将其更改为注释,并且注释显然不会导致错误)。我的模块作为 Jupyter 扩展加载,有人知道这是否需要不同的解决方法吗?谢谢! (2认同)

And*_*rew 254

在python 3中,reload不再是内置函数.

如果你使用的是python 3.4+,你应该reloadimportlib库中使用:

import importlib
importlib.reload(some_module)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是python 3.2或3.3,您应该:

import imp  
imp.reload(module)  
Run Code Online (Sandbox Code Playgroud)

代替.请参阅http://docs.python.org/3.0/library/imp.html#imp.reload

如果您正在使用ipython,请务必考虑使用autoreload扩展名:

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

  • 自Python 3.4起,不推荐使用`imp.reload`,而是使用[`importlib.reload`函数](http://docs.python.org/3.4/library/importlib.html#importlib.reload). (39认同)
  • 我来晚了一点,但是我认为如果您需要重新加载的是模块内部的函数或类,这是行不通的:如果我的导入语句是“ from mymodule import myfunc”,那么“ importlib.reload(myfunc)” `,`importlib.reload(mymodule.myfunc)`,`importlib.reload(mymodule)`都给出NameError。 (2认同)

fun*_*ure 44

实际上,在Python 3中,模块imp被标记为DEPRECATED.好吧,至少对于3.4来说这是真的.

而应使用模块中的reload函数importlib:

https://docs.python.org/3/library/importlib.html#importlib.reload

但请注意,此库在最后两个次要版本中进行了一些API更改.


jss*_*367 24

如果要从模块导入特定的函数或类,可以这样做:

import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function
Run Code Online (Sandbox Code Playgroud)


Lar*_*dua 8

另一个小点:如果您使用了import some_module as sm语法,那么您必须使用别名重新加载模块(sm在本例中):

>>> import some_module as sm
...
>>> import importlib
>>> importlib.reload(some_module) # raises "NameError: name 'some_module' is not defined"
>>> importlib.reload(sm) # works
Run Code Online (Sandbox Code Playgroud)