在 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 08 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
谈谈Python中的while循环语句
Mar 10 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
Python内置函数property()如何使用
Sep 01 Python
python爬虫快速响应服务器的做法
Nov 24 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数据流应用的简单例子
2012/06/01 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
PHP实现的购物车类实例
2015/06/17 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
分享php多功能图片处理类
2016/05/15 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
Python中下划线的使用方法
2015/03/27 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
基于Python解密仿射密码
2019/10/21 Python
python将数据插入数据库的代码分享
2020/08/16 Python
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
高级工程师岗位职责
2013/12/15 职场文书
银行办公室岗位职责
2014/03/10 职场文书
文案策划求职信
2014/03/18 职场文书
2015年招聘工作总结
2014/12/12 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers
SpringBoot Http远程调用的方法
2022/08/14 Java/Android