在 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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
浅谈Python中数据解析
May 05 Python
Python映射拆分操作符用法实例
May 19 Python
Windows和Linux下Python输出彩色文字的方法教程
May 02 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
Python os.access()用法实例
Feb 18 Python
wxpython绘制音频效果
Nov 18 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
Django REST Swagger实现指定api参数
Jul 07 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
详解Python自动化之文件自动化处理
Jun 21 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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写的简易聊天室代码
2011/06/04 PHP
PHP编程风格规范分享
2014/01/15 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
js登录弹出层特效
2014/03/07 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
Python入门篇之文件
2014/10/20 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
python机器人运动范围问题的解答
2019/04/29 Python
python添加菜单图文讲解
2019/06/04 Python
Python异常处理例题整理
2019/07/07 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
C语言编程题
2015/03/09 面试题
大学军训感言200字
2014/02/26 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
标枪加油稿
2015/07/22 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL