在 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实现的维尼吉亚密码算法示例
Apr 12 Python
Python中is和==的区别详解
Nov 15 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
python Shapely使用指南详解
Feb 18 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
python IDLE添加行号显示教程
Apr 25 Python
Python通过Pillow实现图片对比
Apr 29 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 Python
python math模块的基本使用教程
Jan 16 Python
聊一聊python常用的编程模块
May 14 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常用函数 推荐收藏保存
2010/02/21 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
python调用API实现智能回复机器人
2018/04/10 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
采购部经理岗位职责
2014/02/10 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
建筑工地文明标语
2014/10/09 职场文书
街道务虚会发言材料
2014/10/20 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书