在 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 pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
python 的列表遍历删除实现代码
Apr 12 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
Python模拟三级菜单效果
Sep 11 Python
python爬虫获取京东手机图片的图文教程
Dec 29 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
利用Python校准本地时间的方法教程
Oct 31 Python
python中seaborn包常用图形使用详解
Nov 25 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
php封装好的人民币数值转中文大写类
2015/12/20 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
jquery 插件学习(二)
2012/08/06 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python中使用PDB库调试程序
2015/04/05 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
python2 与python3的print区别小结
2018/01/16 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
工伤事故证明
2014/10/20 职场文书
机关作风建设自查报告
2014/10/22 职场文书
计划生育诚信协议书
2014/11/02 职场文书
Nginx实现会话保持的两种方式
2022/03/18 Servers
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android