在Python解释器中如何重新导入更新的模块包?

9 浏览
0 Comments

在Python解释器中如何重新导入更新的模块包?

这个问题在这里已经有答案了:

如何卸载(重新加载)Python模块?

我经常在Python解释器中测试我的模块,当我看到错误时,我会迅速更新.py文件。但是,我该如何让它在解释器中反映出来?到目前为止,我一直在退出和重新进入解释器,因为重新导入文件不起作用。

admin 更改状态以发布 2023年5月20日
0
0 Comments

以上所有关于reload()imp.reload()的答案都已过时。

reload()在Python 3中不再是内置函数,imp.reload()已被标记为过时(请参见help(imp))。

最好使用importlib.reload()

0
0 Comments

Python3的更新: (引用自已经回答的答案, 因为最近的编辑/评论表明了一个已经弃用的方法)

在Python3中,reload已经被移动到imp模块。在3.4中,imp被弃用,改用importlib,在后者中添加了reload。当面向3或更高版本时,要么在调用reload时引用适当的模块,要么导入它。

要点:

  • Python3 >= 3.4: importlib.reload(包名)
  • Python3 < 3.4: imp.reload(包名)
  • Python2: 继续查看以下内容

使用内置函数reload:

https://docs.python.org/2/library/functions.html#reload

当执行reload(模块)时:

  • Python模块的代码被重新编译,模块级别的代码被重新执行,定义了一组新的对象,这些对象绑定到模块字典中的名称上。扩展模块的初始化函数不会再次调用。
  • 与Python中的所有其他对象一样,只有当其引用计数降至零时,旧的对象才会被回收。
  • 模块命名空间中的名称更新为指向任何新的或更改的对象。
  • 对旧对象的其他引用(例如模块外的名称) 不会重新绑定到新对象,并且必须在每个发生它们的命名空间中更新,如果需要的话。

示例:

# Make a simple function that prints "version 1"
shell1$ echo 'def x(): print "version 1"' > mymodule.py
# Run the module
shell2$ python
>>> import mymodule
>>> mymodule.x()
version 1
# Change mymodule to print "version 2" (without exiting the python REPL)
shell2$ echo 'def x(): print "version 2"' > mymodule.py
# Back in that same python session
>>> reload(mymodule)

>>> mymodule.x()
version 2

0