在 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 encode和decode的妙用
Sep 02 Python
python进程类subprocess的一些操作方法例子
Nov 22 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
Python使用asyncio包处理并发详解
Sep 09 Python
django实现用户登陆功能详解
Dec 11 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
Python 处理文件的几种方式
Aug 23 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
python正则表达式 匹配反斜杠的操作方法
Aug 07 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
在python中读取和写入CSV文件详情
Jun 28 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
论坛头像随机变换代码
2006/10/09 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
JPA的特点
2014/10/25 面试题
供货协议书范本
2014/04/22 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
2015年党小组工作总结
2015/05/26 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
Python实现Hash算法
2022/03/18 Python