在 Jupyter 中重新导入特定的 Python 文件(场景分析)
作者:青南 发布时间:2021-01-30 01:16:57
Jupyter 是数据分析领域非常有名的开发环境,使用 Jupyter 写数据分析相关的代码会大大节约开发时间。
设想这样一个场景:别的部门的同事传给你一个数据分析的模块,用于实现对数据的高级分析。模块里面有上百个函数。
如果直接写 Python 文件来调用数据分析模块,那么使用方法非常简单:
from analyze import FathersAnalyzer
data = [...]
father = FathersAnalyzer(data)
result = father.analyze()
print(f'分析结果为:{result}')
现在,你需要使用 Jupyter 来调用这个分析模块。你应该怎么在 Jupyter里面调用?
你可能会觉得,这还不简单吗?直接把这个模块的代码与 Jupyter Notebook 的 .ipynb
文件放在一起,然后在 Jupyter 里面像导入普通模块那样导入即可,如下图所示:
那么现在问题来了,如果我此时修改了 analyze.py
文件,会出现什么情况呢?
我们改一下看看,如下图所示。
重新运行这个 Cell 中的代码,代码中虽然有 from analyze import FathersAnalyzer
,看起来像是重新导入了这个模块,但是运行却发现,它运行的是修改之前的代码。
这是因为,一个 Jupyter Notebook 中的所有代码,都是在同一个运行时中运行的代码,当你多次导入同一个模块时,Python 的包管理机制会自动忽略后面的导入,始终只使用第一次导入的结果(所以使用这种方式也可以实现单例模式)。
那么如果我在修改了被导入的包以后,想重新导入它怎么办呢?有3种方案:
importlib
但这种方案弊端也很明显——除非你按顺序运行每一个 Cell,否则,你的代码会变成下图这样:
在每一个 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)
运行效果如下图所示:
其中关键的代码有三行:
%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 文件的方法,希望对大家有所帮助!
来源:https://juejin.im/post/5db2b8b36fb9a02078054afa


猜你喜欢
- 背景基于现在微服务或者服务化的思想,我们大部分的业务逻辑处理函数都是长这样的:比如grpc服务端:func (s *Service) Get
- 本文实例讲述了Python类的继承、多态及获取对象信息操作。分享给大家供大家参考,具体如下:继承类的继承机制使得子类可以继承父类中定义的方法
- 字面意思上的区别Attribute与property, 都可翻译成属性. 虽然无论是在中文中还是英文中 它们的意思都几乎一样, 但仍有些许差
- 本文实例讲述了Python实现栈的方法。分享给大家供大家参考,具体如下:前言使用Python 实现栈。两种实现方式:基于数组 - 数组同时基
- 一、wxPython介绍 1.wxPython是Python语言的一套优秀的GUI图形库。wxPytho
- 现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率。今天说下用python结合adb命令去实现安卓手机端的通话压力测试
- 实例如下:# bytes object b = b"example" # str object s = "ex
- 当然首先得去下载ASPupload 程序,安装后使用!官方网站下载:http://www.aspupload.com/使用ASP实现文件上载
- 官方其实已经给出了方案,只不过藏的有点深,在加上网上有很多不太靠谱的帖子误导了我(当然不排除我没理解的原因哈)。所以为了让有些朋友的少走点弯
- 今天,在在使用 pycharm 的使用,进行创建 python的时候,发现使用默认的创建的选项使用的python 3环境 。而我系统默认的p
- 1.打开文件:f=open(r'E:\PythonProjects\test7\a.txt',mode='rt
- 本文实例讲述了Python 网络编程之TCP客户端/服务端功能。分享给大家供大家参考,具体如下:demo.py(TCP客户端):import
- 本文简单总结了一下Python处理时间和日期方面的模块,主要就是datetime、time、calendar三个模块的使用,希望这篇文章对于
- 本文实例讲述了vue实现图片懒加载的方法。分享给大家供大家参考,具体如下:vue图片懒加载使用首先第一步,安装插件vue-lazyloadn
- 实战场景 本篇博客学习字体反爬,涉及的站点是实习 x,目标站点地址直接百度搜索即可。可以看到右侧源码中出现了很多&ldqu
- if exists (select * from dbo.sysobjects where id = object_id(N'[db
- 如下所示:<div id="app"><el-form :model="ruleForm2&
- 本文主要介绍了用OpenCV进行年龄和性别检测的实现示例,分享给大家,具体如下:在本文中,我将带您完成用 Python 进行机器学习的年龄和
- 可直接用这行命令!: pip install -U scikit-learn其他命令: (1)更新pippython -m pip inst
- 第一:mysql服务的启动和停止net stop mysqlnet start mysql第二:登陆mysql –u用户名 [–h主机名或者