详解运行Python的神器Jupyter Notebook


Posted in Python onJune 03, 2021

Jupyter Notebook

Jupyter项目是从Ipython项目中分出去的,在Ipython3.x之前,他们两个是在一起发布的。在Ipython4.x之后,Jupyter作为一个单独的项目进行开发和管理。因为Jupyter不仅仅可以运行Python程序,它还可以执行其他流程编程语言的运行。

Jupyter Notebook包括三个部分,第一个部分是一个web应用程序,提供交互式界面,可以在交互式界面中运行相应的代码。

详解运行Python的神器Jupyter Notebook

上图是NoteBook的交互界面,我们可以对文档进行编辑,运行等操作。

主要的功能如下:

  • 在浏览器中进行代码编辑,自动语法突出显示,缩进和制表符完成/自检功能。
  • 从浏览器执行代码的能力,并将计算结果附加到生成它们的代码上。
  • 使用诸如HTML,LaTeX,PNG,SVG等富媒体表示来显示计算结果。例如,可以内嵌包含matplotlib库渲染的具有出版质量的图形。
  • 使用Markdown标记语言在浏览器中对富文本进行的编辑(可以为代码提供注释)不仅限于纯文本。
  • 使用LaTeX轻松在markdown单元中包含数学符号的能力,并由MathJax本地呈现。

第二个部分就是NoteBook的文档了,这个文档存储了要运行的代码和一些描述信息。一般这个文档是以.ipynb的后缀进行存储的。

notebook文档是以json的形式存储的,并用base64进行编码。使用json的好处就是可以在不同的服务器中方便的进行数据的交互。

Notebook documents中除了可运行的代码文件,还可以存储说明等解释性内容,从而将代码和解释内容完美结合,尤其适合做学习笔记使用。

笔记本可以通过nbconvert命令导出为多种静态格式,包括HTML,reStructuredText,LaTeX,PDF等多种格式。

另外文档还可以方便的在网络上进行共享。

第三个部分就是代码运行的核心Kernels,通过不同的Kernels搭配,notebook可以支持运行多种程序。比如:Python,java,go,R,ruby,nodejs等等。

这些Kernels和notebook之间是以Json的形式通过MQ来进行通信的。

启动notebook server

有了文档之后,如果我们想要运行文档,需要启动notebook server。

jupyter notebook

默认情况下会开启下面的URL: http://127.0.0.1:8888

启动的时候还可指定要打开的.ipynb文件:

jupyter notebook my_notebook.ipynb

具体的notebook界面的操作这里就不多介绍了,基本上和普通的编译器差不多。大家可以自行探索。

notebook document 的结构

notebook中包含了多个cells,每个cell中包含了多行文本输入字段,可以通过Shift-Enter 或者工具栏中的播放按钮来执行其中的代码。

这里的cell有三种类型,分别是code cells,markdown cells和raw cells。

code cells

代码单元允许您编辑和编写新代码,并突出显示完整的语法和制表符。 您使用的编程语言取决于内核,默认内核(IPython)运行Python代码。

执行代码单元时,它包含的代码将发送到与笔记本关联的内核。 然后,从该计算返回的结果将在笔记本中显示为单元格的输出。 输出不仅限于文本,还有许多其他可能的输出形式,包括matplotlib图形和HTML表格(例如,在pandas数据分析包中使用的表格)。

我们看一个code cells的例子:

#%%

import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))

每个单元格是以 #%% 来进行分隔的。

Ipython本身还支持多种富文本的展示格式,包括HTML,JSON,PNG,JPEG,SVG,LaTeX等。

Ipython提供了一个display方法,我们可以使用display来展示要呈现的对象:

from IPython.display import display

display(obj) 将会寻找这个对象所有可能的展示类型,并从中挑选一个最适合的类型进行展示,并将结果存储在Notebook文档里面。

如果你想展示特定类型的对象,那么可以这样:

from IPython.display import (
    display_pretty, display_html, display_jpeg,
    display_png, display_json, display_latex, display_svg
)

举个展示图片的例子:

from IPython.display import Image
i = Image(filename='../images/ipython_logo.png')
i
display(i)

上面的例子中i包含了一个Image对象,直接调用i即可展示,我们也可以显示的调用display(i)。

其他的富文本类型可以参考Image,使用方法都是类似的。

markdown cells

markdown是一种简介的标记语言,使用起来非常简单,使用范围非常广泛,所以notebook document也支持markdown的语法。

先看一个markdown cell的例子:

#%% md

```python
$ python
Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 5
>>> print(a)
5
```

markdown中的语法在notebook中都是可以用的。

还支持标准的LaTeX 和 AMS-LaTeX语法。

raw cells

原始单元格提供了一个可以直接写入输出的位置。 notebook不会对原始单元格中的内容进行计算。

以模块的形式导入Jupyter Notebooks

有时候我们希望以模块的形式导入Jupyter Notebooks,但是可惜的是,Jupyter Notebooks并不是一个标准的python程序,不过Python提供了一些钩子程序,让我们能够方便的进行导入。

首先,我们需要导入一些基本的API :

import io, os, sys, types

from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell

接下来需要注册NotebookFinder到sys.meta_path:

sys.meta_path.append(NotebookFinder())

这个NotebookFinder就是定义的钩子。

我们看下NotebookFinder的定义:

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]

里面使用了两个重要的方法,find_notebook用来找到notebook,和NotebookLoader,用来加载notebook。

看下find_notebook的定义:

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

看下NotebookLoader的定义:

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

有了他们,我们就可以直接import我们自己编写的notebook了。

以上就是详解运行Python的神器Jupyter Notebook的详细内容,更多关于运行Python的神器Jupyter Notebook的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
python实现k-means聚类算法
Feb 23 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
用python打印1~20的整数实例讲解
Jul 01 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
关于Keras Dense层整理
May 21 Python
Python如何输出整数
Jun 07 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
python中如何对多变量连续赋值
Python连续赋值需要注意的一些问题
Jun 03 #Python
pytorch fine-tune 预训练的模型操作
Jun 03 #Python
Python实现byte转integer
Jun 03 #Python
Python数据分析之绘图和可视化详解
Python数据分析之pandas读取数据
Jun 02 #Python
Python 如何实现文件自动去重
You might like
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python_LDA实现方法详解
2017/10/25 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
2014年高一班主任工作总结
2014/12/05 职场文书
高老头读书笔记
2015/06/30 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Python matplotlib绘制雷达图
2022/04/13 Python