在 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之有容乃大的list(3)
Sep 15 Python
python实现DES加密解密方法实例详解
Jun 30 Python
Python中字典的基础知识归纳小结
Aug 19 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
Python ConfigParser模块的使用示例
Oct 12 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随机显示图片的简单示例
2014/02/15 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP数组实例详解
2016/06/26 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
公司营业员的工作总结自我评价
2013/10/05 职场文书
大学毕业感言50字
2014/02/07 职场文书
挂牌仪式主持词
2014/03/20 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
北京天坛导游词
2015/02/12 职场文书
贷款工资证明范本
2015/06/12 职场文书
车间班组长竞聘书
2015/09/15 职场文书
八年级物理教学反思
2016/02/19 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python