Python 重新加载模块

在进行模块化编程时,经常会遇到这样一种场景:

编写了一个 Python 模块,并用 import my_module 的形式进行导入。当对该模块进行更改后,即使重新导入,其中的任何改变都不会被识别,这使得模块调试变得非常困难。

那么,该如何解决这个问题?

模块仅被导入一次

出于效率原因(导入必须找到文件,将其编译成字节码,并且运行代码),Python shell 在每次会话中,只对每个模块导入一次。

例如,有一个名为 hello.py 的模块,包含以下代码:

print('Hello,Python!')

如果多次导入,会出现什么效果?

>>> import hello
Hello,Python!
>>> import hello
>>> import hello

可以看到,代码只执行了一次。也就是说,模块仅被导入了一次。

重新加载模块

倘若,更改了已经在 python shell 中导入的模块,然后重新导入该模块,python会认为“我已经导入了该模块,不需要再次读取该文件”,所以更改将无效。

要解决这个问题,有以下几种方式:

  • 最简单、最有效的方法:重新启动 python shell 。但是,这也有缺点,特别是丢失了 python shell 名称空间中存在的数据以及其他导入模块中的数据。
  • 对于简单的情况,可以使用python的reload()函数。在许多情况下,在编辑一个模块之后就足够了。
  • 对于更复杂的情况,重新加载被编辑的模块也需要重新加载其依赖/导入的模块(因为它们必须作为被编辑模块初始化的一部分进行初始化),所以IPython的 autoreload 扩展很有用。

reload是python提供的一种简洁的模块重载方式,在不同的python版本中有不同的表现形式:

  • 在python 2.x中,使用内置函数reload(module)
  • 在python 3.0 - 3.3中,可以使用 imp.reload(module)
  • 在python 3.4及以后,imp已经被废弃,取而代之的是 importlib.reload(module)

代码如下:

>>> import importlib
>>> import hello
Hello,Python!      #修改前的内容
>>>

#修改hello.py模块中的输入内容

>>> importlib.reload(hello)
I am coming...     #修改后的内容
<module 'hello' from '/Users/apple/projects/hello.py'>'

另外的参考

为防止两个模块互相导入的问题,python默认所有的模块都只导入一次,如果需要重新导入模块
python2.7可以直接用内置函数reload(module),python3则根据不同的版本用下面几种方法:

  • 方法一:python3初期版本的基本方法

from imp import reload
reload(module)

  • 方法二:按照套路,可以这样

import imp
imp.reload(module)

  • 方法三:而python3后期版本的基本方法

import importlib
importlib.reload(module)

  • 方法四:根据天理,当然也可以这样

from importlib import reload
reload(module)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值