Python科学计算(第2版)
上QQ阅读APP看书,第一时间看更新

1.2.4 定制IPython Notebook

虽然IPython只提供了最基本的编辑、运行Notebook的功能,但是它具有丰富的可定制性,用户可以根据自己的需要打造出独特的Notebook开发环境。如图1-8所示,IPython Notebook系统由浏览器、服务器和运算核三部分组成。IPython分别提供了这三部分的定制方法。

1.用户配置(profile)

每次启动IPython时都会从指定的用户配置(profile)文件夹下读取配置信息。下面的代码输出当前的用户配置文件夹的路径:该路径由HOME环境变量、.ipython和profile_配置名构成。

在本书提供的运行IPython Notebook的批处理文件中配置了HOME环境变量,因此能将配置文件夹和Notebook文件一起打包。

    import os
    ipython = get_ipython()
    print "HOME环境变量:", os.environ["HOME"]
    print "IPython配置文件夹:", ipython.ipython_dir
    print "当前的用户配置文件夹:", ipython.config.ProfileDir.location
    HOME环境变量: C:\Users\RY\Dropbox\scipybook2\settings
    IPython配置文件夹: C:\Users\RY\Dropbox\scipybook2\settings\.ipython
    当前的用户配置文件夹: 
        C:\Users\RY\Dropbox\scipybook2\settings\.ipython\profile_scipybook2

当前的用户配置文件夹:

    ipython profile create test

修改用户配置文件夹之下的配置文件之后,在启动Notebook时通过--profile参数指定所采用的用户配置:

    ipython notebook --profile test

2.服务器扩展插件和Notebook扩展插件

在.ipython文件夹之下还有两个子文件夹——extensions和nbextensions,它们分别用于保存服务器和浏览器的扩展程序。

●extensions:存放用Python编写的服务器扩展程序。

●nbextensions:存放Notebook客户端的扩展程序,通常为JavaScript和CSS样式表文件。

Notebook的服务器基于tornado服务器框架开发,因此编写服务器的扩展程序需要了解tornado框架,而开发Notebook客户端(浏览器的界面部分)的扩展程序则需要了解HTML、JavaScript和CSS样式表等方面的内容。这些内容与本书的主题无关,就不再详细叙述了。下面看看如何安装他人开发的扩展程序。

首先执行下面的语句来安装Notebook客户端的扩展程序,user参数为True表示将扩展安装在HOME环境变量路径之下的.ipython文件夹中:

    import IPython.html.nbextensions as nb
    ext= 'https://github.com/ipython-contrib/IPython-notebook-extensions/archive/3.x.zip'
    nb.install_nbextension(ext, user=True)

上面的程序将在nbextensions文件夹下创建IPython-notebook-extensions-3.x文件夹,其中包含了许多客户端扩展程序。接下来按照如下步骤完成安装:

(1)将nbextensions\IPython-notebook-extensions-3.x\config移到nbextensions文件夹之下。

(2)将nbextensions\config\nbextensions.py移到extensions文件夹之下。

(3)在.ipython之下创建templates文件夹。

(4)将nbextensions\config\nbextensions.html移到templates文件夹之下。

(5)将nbextensions\config\ipython_notebook_config.py中的代码添加到profile_default\ipython_ notebook_config.py中。

(6)访问http://localhost:8888/nbextensions/,在该页面上可以管理nbextensions文件夹下安装的客户端扩展程序。

当Notebook服务器启动时,会运行用户配置(profile)文件夹之下的ipython_notebook_config.py文件,并使用其中的配置。

下面是ipython_notebook_config.py中的配置代码。❶首先将extensions文件夹添加到Python的模块搜索路径之下,因此该路径之下的nbextensions.py文件可以通过import nbextensions载入。❷指定服务器扩展程序的模块名,由于之前添加了搜索路径,因此Python可以直接通过模块名'nbextensions'找到对应的文件nbextensions.py。❸将templates文件夹添加到服务器扩展程序的网页模板的搜索路径,让服务器可以找到nbextensions.html文件。

    from IPython.utils.path import get_ipython_dir
    import os
    import sys
    
    ipythondir = get_ipython_dir()
    extensions = os.path.join(ipythondir,'extensions') 
    sys.path.append( extensions ) ❶
    
    c = get_config()
    c.NotebookApp.server_extensions = [ 'nbextensions'] ❷
    c.NotebookApp.extra_template_paths = [os.path.join(ipythondir,'templates')] ❸

nbextensions扩展程序为服务器添加了一个新的URL——http://localhost:8888/nbextensions/,通过该路径可以开启或禁止指定的客户端扩展程序。nbextensions扩展程序通过递归搜索nbextensions文件夹下的YAML文件识别客户端扩展程序,IPython-notebook-extensions-3.x目录下只有部分扩展程序附带了YAML文件,读者可以仿照这些文件为其他的扩展程序添加相应的YAML文件,这样就可以通过nbextensions页面管理扩展程序了。

3.添加新的运算核

由于执行用户代码的运算核与Notebook服务器是独立的进程,因此不同的Notebook可以使用不同版本的Python,甚至是其他语言的运算核。IPython的下一个版本将改名为Jupyter,其目标是创建通用的科学计算的开发环境,支持Julia、Python和R等在数据处理领域流行的语言。下面以Python3-64bit为例介绍如何添加新的运算核。

首先从WinPython的网址下载WinPython-64bit-3.4.3.3.exe,并安装在C盘根目录之下。然后运行下面的代码来创建运算核配置文件:

    import os
    from os import path
    import json
    
    ipython = get_ipython()
    kernels_folder = path.join(ipython.ipython_dir, "kernels")
    if not path.exists(kernels_folder):
        os.mkdir(kernels_folder)
    
    python3_path = "C:\\WinPython-64bit-3.4.3.3\\scripts\\python.bat"
    
    kernel_settings = {
     "argv": [python3_path, 
              "-m", "IPython.kernel", "-f", "{connection_file}"],
     "display_name": "Python3-64bit",
     "language": "python"
    }
    
    kernel_folder = path.join(kernels_folder, kernel_settings["display_name"])
    if not path.exists(kernel_folder):
        os.mkdir(kernel_folder)
    
    kernel_fn = path.join(kernel_folder, "kernel.json")
    
    with open(kernel_fn, "w") as f:
        json.dump(kernel_settings, f, indent=4)

上面的代码创建.ipython\kernels\python3-64bit\kernel.json文件,它是一个JSON格式的字典,其中"argv"键为运算核的启动命令,"display_name"为运算核的显示名称,"language"为运算核的语言。

刷新Notebook的索引页面之后,可以在“New”下拉菜单中找到“Python3-64bit”选项,单击它将打开一个以Python3 64bit解释器为运算核的Notebook页面。在Notebook页面中也可以使用“Kernel”菜单更改当前的运算核。运算核的配置保存在Notebook文件中,因此下一次开启Notebook时,将自动使用最后一次选择的运算核。

感兴趣的读者可以试试添加更多的运算核,笔者在Windows系统下成功地安装了PyPy、Julia、R、NodeJS等运算核。