在 Jupyter 中重新导入特定的 Python 文件(场景分析)


Posted in Python onOctober 27, 2019

Jupyter 是数据分析领域非常有名的开发环境,使用 Jupyter 写数据分析相关的代码会大大节约开发时间。

设想这样一个场景:别的部门的同事传给你一个数据分析的模块,用于实现对数据的高级分析。模块里面有上百个函数。

如果直接写 Python 文件来调用数据分析模块,那么使用方法非常简单:

from analyze import FathersAnalyzer

data = [...]
father = FathersAnalyzer(data)
result = father.analyze()
print(f'分析结果为:{result}')

现在,你需要使用 Jupyter 来调用这个分析模块。你应该怎么在 Jupyter里面调用?

你可能会觉得,这还不简单吗?直接把这个模块的代码与 Jupyter Notebook 的 .ipynb 文件放在一起,然后在 Jupyter 里面像导入普通模块那样导入即可,如下图所示:

在 Jupyter 中重新导入特定的 Python 文件(场景分析)

那么现在问题来了,如果我此时修改了 analyze.py 文件,会出现什么情况呢?

我们改一下看看,如下图所示。

在 Jupyter 中重新导入特定的 Python 文件(场景分析)

重新运行这个 Cell 中的代码,代码中虽然有 from analyze import FathersAnalyzer ,看起来像是重新导入了这个模块,但是运行却发现,它运行的是修改之前的代码。

这是因为,一个 Jupyter Notebook 中的所有代码,都是在同一个运行时中运行的代码,当你多次导入同一个模块时,Python 的包管理机制会自动忽略后面的导入,始终只使用第一次导入的结果(所以使用这种方式也可以实现单例模式)。

那么如果我在修改了被导入的包以后,想重新导入它怎么办呢?有3种方案:

importlib

在 Jupyter 中重新导入特定的 Python 文件(场景分析)

但这种方案弊端也很明显——除非你按顺序运行每一个 Cell,否则,你的代码会变成下图这样:

在 Jupyter 中重新导入特定的 Python 文件(场景分析)

在每一个 Cell 里面都需要 重新加载一次分析模块,否则,很有可能在你单独运行某一个 Cell 的时候,用的是老的代码,就会导致难以察觉的 bug。

使用 Jupyter 自带的 %autoreload :

%load_ext autoreload
%autoreload 1
%aimport analyze 

data = 123
importlib.reload(analyze)
father = analyze.FathersAnalyzer(data)
result = father.analyze()
print(result)

运行效果如下图所示:

在 Jupyter 中重新导入特定的 Python 文件(场景分析)

其中关键的代码有三行:

%load_ext autoreload
%autoreload 1
%aimport analyze

这三行代码只有在 Jupyter 里面才能正常运行,在 普通的.py 文件里面这样写会报错。它们的作用是:第1行启动 autoreload 机制。第2行,设置自动加载通过 %aimport 导入的模块。第3行使用 %aimport 导入 analyze 模块。

这样写以后,任意一个 Cell 运行,所有被 %aimport 导入的模块都会被重新加载一次。从而让你每次都使用最新的代码。

当然,你还可以进一步偷懒,把特殊代码缩减为2行:

%load_ext autoreload
%autoreload 2

%autoreload 后面的参数被设置为2时,每次运行任意一个 Cell,都会自动重新加载所有 import xxx 导入的模块。这样做的代价是,运行会慢一些。

总结

以上所述是小编给大家介绍的在 Jupyter 中重新导入特定的 Python 文件的方法,希望对大家有所帮助!

Python 相关文章推荐
Python编写百度贴吧的简单爬虫
Apr 02 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
python简单实现计算过期时间的方法
Jun 09 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
python如何重载模块实例解析
Jan 25 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
python实现人像动漫化的示例代码
May 17 Python
pycharm debug 断点调试心得分享
Apr 16 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 #Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 #Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 #Python
python用类实现文章敏感词的过滤方法示例
Oct 27 #Python
通过字符串导入 Python 模块的方法详解
Oct 27 #Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 #Python
python图的深度优先和广度优先算法实例分析
Oct 26 #Python
You might like
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php链表用法实例分析
2015/07/09 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
基于python实现文件加密功能
2020/01/06 Python
python2 对excel表格操作完整示例
2020/02/23 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
英文求职信结束语大全
2013/10/26 职场文书
爱情检讨书大全
2014/01/21 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
法定代表人证明书
2014/11/28 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
Java 在线考试云平台的实现
2021/11/23 Java/Android