在 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中使用PIPE操作Linux管道
Feb 04 Python
Python中subprocess模块用法实例详解
May 20 Python
Python装饰器基础详解
Mar 09 Python
python监测当前联网状态并连接的实例
Dec 18 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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/10 日漫
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
理解和运用PHP中的多态性[译]
2011/08/02 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php中in_array函数用法探究
2014/11/25 PHP
PHP安全上传图片的方法
2015/03/21 PHP
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
python使用正则筛选信用卡
2019/01/27 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
贺卡寄语大全
2014/04/11 职场文书
反邪教警示教育方案
2014/05/13 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
服装设计师求职信
2014/06/04 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
公司年夜饭通知
2015/04/25 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis