前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 重新加载模块

Python 重新加载模块

作者头像
py3study
发布2020-01-03 16:23:53
4.2K0
发布2020-01-03 16:23:53
举报
文章被收录于专栏:python3python3

简述

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

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

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

| 版权声明:一去、二三里,未经博主允许不得转载。

模块仅被导入一次

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

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

代码语言:javascript
复制
print('Hello, Python!')

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

代码语言:javascript
复制
>>> import hello
Hello, Python!
>>> 
>>> import hello
>>> import hello

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

重新加载模块

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

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

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

PS: 下面主要介绍第 2 种方式 - reload(),其他方式自行尝试。

reload() 是 Python 提供的一种简洁的方式,在不同的 Python 版本中有不同的表现形式:

代码语言:javascript
复制
>>> import importlib
>>> import hello
Hello, Python!  # 修改前的内容
>>> 
>>> importlib.reload(hello)
I am coming...  # 修改后的内容
<module 'hello' from '/home/wang/Projects/hello.py'>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简述
  • 模块仅被导入一次
  • 重新加载模块
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档