在 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 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python常用正则表达式符号浅析
Aug 13 Python
Python实现简单状态框架的方法
Mar 19 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
Python中无限循环需要什么条件
May 27 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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获取MAC地址的函数代码
2011/09/11 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
JS简单计算器实例
2015/01/20 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
谈谈如何手动释放Python的内存
2016/12/17 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python根据多个文件名批量查找文件
2019/08/13 Python
python sorted函数的小练习及解答
2019/09/18 Python
python socket 聊天室实例代码详解
2019/11/14 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
优秀教师主要事迹
2014/02/01 职场文书
企业趣味活动方案
2014/08/21 职场文书
培训简讯范文
2015/07/20 职场文书
施工安全责任协议书
2016/03/23 职场文书