关于python:可视化运行Python的神器Jupyter-Notebook

40次阅读

共计 5076 个字符,预计需要花费 13 分钟才能阅读完成。

简介

如果咱们想要运行 Python,通常有两种形式,第一种形式就是在 Python 或者 IPython 的解释器环境中进行交互式运行,还有一种形式就是程序员最喜爱的编写.py 文件,在文件中编写 python 代码,而后运行。

如果咱们想写一篇对于 Python 的文章,文章外面有代码,还心愿代码可能在以后页面运行,可不可以做到呢?

能够的,那就是应用咱们明天要介绍的 Jupyter Notebook。

Jupyter Notebook

Jupyter 我的项目是从 Ipython 我的项目中分进来的,在 Ipython3.x 之前,他们两个是在一起公布的。在 Ipython4.x 之后,Jupyter 作为一个独自的我的项目进行开发和治理。因为 Jupyter 不仅仅能够运行 Python 程序,它还能够执行其余流程编程语言的运行。

Jupyter Notebook 包含三个局部,第一个局部是一个 web 应用程序,提供交互式界面,能够在交互式界面中运行相应的代码。

上图是 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 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 了。

本文已收录于 http://www.flydean.com/12-jupyter-notebook/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0