在jupyter notebook中调用.ipynb文件方式


Posted in Python onApril 14, 2020

正常来说在jupyter notebook 中只能调用.py文件,要想要调用jupyter notebook自己的文件会报错。

Jupyter Notebook官网介绍了一种简单的方法:

http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Importing%20Notebooks.html

添加jupyter notebook解析文件

首先,创建一个python文件,例如Ipynb_importer.py,代码如下:

import io, os,sys,types
from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell

class NotebookFinder(object):
 """Module finder that locates Jupyter Notebooks"""
 def __init__(self):
  self.loaders = {}

 def find_module(self, fullname, path=None):
  nb_path = find_notebook(fullname, path)
  if not nb_path:
   return

  key = path
  if path:
   # lists aren't hashable
   key = os.path.sep.join(path)

  if key not in self.loaders:
   self.loaders[key] = NotebookLoader(path)
  return self.loaders[key]

def find_notebook(fullname, path=None):
 """find a notebook, given its fully qualified name and an optional path

 This turns "foo.bar" into "foo/bar.ipynb"
 and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
 does not exist.
 """
 name = fullname.rsplit('.', 1)[-1]
 if not path:
  path = ['']
 for d in path:
  nb_path = os.path.join(d, name + ".ipynb")
  if os.path.isfile(nb_path):
   return nb_path
  # let import Notebook_Name find "Notebook Name.ipynb"
  nb_path = nb_path.replace("_", " ")
  if os.path.isfile(nb_path):
   return nb_path

class NotebookLoader(object):
 """Module Loader for Jupyter Notebooks"""
 def __init__(self, path=None):
  self.shell = InteractiveShell.instance()
  self.path = path

 def load_module(self, fullname):
  """import a notebook as a module"""
  path = find_notebook(fullname, self.path)

  print ("importing Jupyter notebook from %s" % path)

  # load the notebook object
  with io.open(path, 'r', encoding='utf-8') as f:
   nb = read(f, 4)


  # create the module and add it to sys.modules
  # if name in sys.modules:
  # return sys.modules[name]
  mod = types.ModuleType(fullname)
  mod.__file__ = path
  mod.__loader__ = self
  mod.__dict__['get_ipython'] = get_ipython
  sys.modules[fullname] = mod

  # extra work to ensure that magics that would affect the user_ns
  # actually affect the notebook module's ns
  save_user_ns = self.shell.user_ns
  self.shell.user_ns = mod.__dict__

  try:
   for cell in nb.cells:
   if cell.cell_type == 'code':
    # transform the input to executable Python
    code = self.shell.input_transformer_manager.transform_cell(cell.source)
    # run the code in themodule
    exec(code, mod.__dict__)
  finally:
   self.shell.user_ns = save_user_ns
  return mod
sys.meta_path.append(NotebookFinder())

调用jupyter notebook module

只要在我们的工作目录下放置Ipynb_importer.py文件,就可以正常调用所有的jupyter notebook文件。 这种方法的本质就是使用一个jupyter notenook解析器先对.ipynb文件进行解析,把文件内的各个模块加载到内存里供其他python文件调用。

新建一个文件foo.ipynb

def foo():
 print("foo")

再新建一个ipynb文件,调用foo这个文件

import Ipynb_importer
import foo
foo.foo()

运行结果如下:

importing Jupyter notebook from foo.ipynb
foo

补充知识:jupyter notebook_主函数文件如何调用类文件

使用jupyter notebook编写python程序,rw_visual.jpynb是写的主函数,random_walk.jpynb是类(如图)。在主函数中将类实例化后运行会报错,经网络查找解决了问题,缺少Ipynb_importer.py这样一个链接文件。

在jupyter notebook中调用.ipynb文件方式

解决方法:

1、在同一路径下创建名为Ipynb_importer.py的文件:File-->download as-->Python(.py),该文件内容如下:

#!/usr/bin/env python
# coding: utf-8
# In[ ]:
 
import io, os,sys,types
from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell
 
class NotebookFinder(object):
 """Module finder that locates Jupyter Notebooks"""
 def __init__(self):
  self.loaders = {}
 
 def find_module(self, fullname, path=None):
  nb_path = find_notebook(fullname, path)
  if not nb_path:
   return
 
  key = path
  if path:
   # lists aren't hashable
   key = os.path.sep.join(path)
 
  if key not in self.loaders:
   self.loaders[key] = NotebookLoader(path)
  return self.loaders[key]
 
def find_notebook(fullname, path=None):
 """find a notebook, given its fully qualified name and an optional path
 This turns "foo.bar" into "foo/bar.ipynb"
 and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
 does not exist.
 """
 name = fullname.rsplit('.', 1)[-1]
 if not path:
  path = ['']
 for d in path:
  nb_path = os.path.join(d, name + ".ipynb")
  if os.path.isfile(nb_path):
   return nb_path
  # let import Notebook_Name find "Notebook Name.ipynb"
  nb_path = nb_path.replace("_", " ")
  if os.path.isfile(nb_path):
   return nb_path
 
class NotebookLoader(object):
 """Module Loader for Jupyter Notebooks"""
 def __init__(self, path=None):
  self.shell = InteractiveShell.instance()
  self.path = path
 
 def load_module(self, fullname):
  """import a notebook as a module"""
  path = find_notebook(fullname, self.path)
 
  print ("importing Jupyter notebook from %s" % path)
 
  # load the notebook object
  with io.open(path, 'r', encoding='utf-8') as f:
   nb = read(f, 4)
 
 
  # create the module and add it to sys.modules
  # if name in sys.modules:
  # return sys.modules[name]
  mod = types.ModuleType(fullname)
  mod.__file__ = path
  mod.__loader__ = self
  mod.__dict__['get_ipython'] = get_ipython
  sys.modules[fullname] = mod
 
  # extra work to ensure that magics that would affect the user_ns
  # actually affect the notebook module's ns
  save_user_ns = self.shell.user_ns
  self.shell.user_ns = mod.__dict__
 
  try:
   for cell in nb.cells:
   if cell.cell_type == 'code':
    # transform the input to executable Python
    code = self.shell.input_transformer_manager.transform_cell(cell.source)
    # run the code in themodule
    exec(code, mod.__dict__)
  finally:
   self.shell.user_ns = save_user_ns
  return mod
sys.meta_path.append(NotebookFinder())

2、在主函数中import Ipynb_importer

import matplotlib.pyplot as plt
import Ipynb_importer
 
from random_walk import RandomWalk
 
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values, rw.y_values, s=15)
plt.show()

3、运行主函数,调用成功

ps:random_walk.jpynb文件内容如下:

from random import choice
 
class RandomWalk():
 def __init__(self, num_points=5000):
  self.num_points = num_points
  self.x_values = [0]
  self.y_values = [0]
  
 def fill_walk(self):
  while len(self.x_values) < self.num_points:
   x_direction = choice([1,-1])
   x_distance = choice([0,1,2,3,4])
   x_step = x_direction * x_distance
   
   y_direction = choice([1,-1])
   y_distance = choice([0,1,2,3,4])
   y_step = y_direction * y_distance
   
   if x_step == 0 and y_step == 0:
    continue
    
   next_x = self.x_values[-1] + x_step
   next_y = self.y_values[-1] + y_step
   
   self.x_values.append(next_x)
   self.y_values.append(next_y)

运行结果:

在jupyter notebook中调用.ipynb文件方式

以上这篇在jupyter notebook中调用.ipynb文件方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
Python之父谈Python的未来形式
Jul 01 Python
简单的python后台管理程序
Apr 13 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
Python数据结构之图的应用示例
May 11 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python中round函数如何使用
Jun 19 Python
Python实现视频自动打码的示例代码
Apr 08 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 #Python
Python使用pyyaml模块处理yaml数据
Apr 14 #Python
Jupyter Notebook打开任意文件夹操作
Apr 14 #Python
Python requests模块cookie实例解析
Apr 14 #Python
Python requests模块session代码实例
Apr 14 #Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 #Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 #Python
You might like
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
python中pass语句用法实例分析
2015/04/30 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
公司委托书范本5篇
2014/09/20 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers