在 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的Flask框架中web表单的教程
Apr 20 Python
基于Python的接口测试框架实例
Nov 04 Python
Golang与python线程详解及简单实例
Apr 27 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
详解django中使用定时任务的方法
Sep 27 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
Python ellipsis 的用法详解
Nov 20 Python
python中redis包操作数据库的教程
Apr 19 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP之短标签开启设置
2013/06/17 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
js实现无缝轮播图
2020/03/09 Javascript
python动态加载变量示例分享
2014/02/17 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
小学生元旦广播稿
2014/02/21 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
房地产项目合作意向书
2015/05/08 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
Python字典的基础操作
2021/11/01 Python