在 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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
详解Python装饰器
Mar 25 Python
python儿童学游戏编程知识点总结
Jun 03 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
django 解决扩展自带User表遇到的问题
May 14 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
Python基于百度API识别并提取图片中文字
Jun 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 分页原理详解
2009/08/21 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
Javascript开发包大全整理
2006/12/22 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python3 简单实现组合设计模式
2020/07/02 Python
python反扒机制的5种解决方法
2021/02/06 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
幼儿园开学寄语
2014/04/03 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
企业整改报告范文
2014/11/08 职场文书
怎么写工作检讨书
2014/11/16 职场文书
首席执行官观后感
2015/06/03 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
详细了解java监听器和过滤器
2021/07/09 Java/Android