在 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类方法__init__和__del__构造、析构过程分析
Mar 06 Python
Python中使用支持向量机SVM实践
Dec 27 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
python批量修改文件编码格式的方法
May 31 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
用python做游戏的细节详解
Jun 25 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
python输出带颜色字体实例方法
Sep 01 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python 生成器和迭代器的原理解析
Oct 12 Python
详解python itertools功能
Feb 07 Python
分析Python list操作为什么会错误
Nov 17 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笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
采用call方式实现js继承
2014/05/20 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
Python+Opencv识别两张相似图片
2020/03/23 Python
Python的requests网络编程包使用教程
2016/07/11 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python、Matlab求定积分的实现
2019/11/20 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
python中pow函数用法及功能说明
2020/12/04 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
2014年房产销售工作总结
2014/12/08 职场文书
我的长征观后感
2015/06/09 职场文书
让子弹飞观后感
2015/06/11 职场文书
医者仁心观后感
2015/06/17 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
python xlwt模块的使用解析
2021/04/13 Python
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL