如何检查是否启用了Jupyter Notebook扩展?

时间:2017-08-12 19:21:23

标签: python matplotlib jupyter-notebook jupyter ipywidgets

如果启用ipywidgets,我想以编程方式检查Jupyter Notebook。有什么方法可以这样做?我尝试查看nbextensionsnotebook模块,但没有找到列出已启用扩展的函数。

我的笔记本在GitHub上,我想在那里提供一个静态图,如果用户实际运行笔记本并安装了ipywidgets并启用了,那么还需要一个交互式版本。

绘图代码是

# Setup by importing some libraries and configuring a few things
import numpy as np
import ipywidgets
import matplotlib.pyplot as plt
%matplotlib inline

# Create two random datasets
data = np.random.random(15)
smallerdata = np.random.random(15) * 0.3

# Define a plotting function
def drawPlot():
    plt.plot(range(len(data)), data, label="random data");
    plt.plot(range(len(smallerdata)), smallerdata, 'r--', label="smaller random data");
    plt.title("Two random dataset compared");
    plt.grid(axis='y');
    plt.legend();

# Define an interactive annotation function
def updatePlot(s=0):
    print("data {0:.2f}, smallerdata {1:.2f}".format(data[s], smallerdata[s]))
    drawPlot()
    plt.annotate(s=round(data[s], 2),
                 xy=(s, data[s]),
                 xytext=(s + 2, 0.5),
                 arrowprops={'arrowstyle': '->'});
    plt.annotate(s=round(smallerdata[s], 2),
                 xy=(s, smallerdata[s]),
                 xytext=(s + 2, 0.3),
                 arrowprops={'arrowstyle': '->'});
    plt.show();

在伪代码中,我想实现这样的目标:

if nbextensions.enabled('ipywidgets'):
    slider = ipywidgets.interactive(updatePlot, s=(0, len(data) - 1, 1));
    display(slider)
else:
    drawPlot()

从命令行,概念上类似的命令是jupyter nbextension list,但是我想从正在运行的Python环境中执行此操作,当用户只是在GitHub上查看Notebook时(或类似的)也提供静态图)。

谢谢:)

2 个答案:

答案 0 :(得分:2)

我可能会误解这里究竟要求的是什么;但是,我觉得通常的try - except解决方案可行。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

data = np.random.random(15)
smallerdata = np.random.random(15) * 0.3

def drawPlot():
    plt.plot(range(len(data)), data, label="random data");
    plt.plot(range(len(smallerdata)), smallerdata, 'r--', label="smaller random data");
    plt.title("Two random dataset compared");
    plt.grid(axis='y');
    plt.legend();

def updatePlot(s=0):
    print("data {0:.2f}, smallerdata {1:.2f}".format(data[s], smallerdata[s]))
    drawPlot()
    plt.annotate(s=round(data[s], 2),
                 xy=(s, data[s]),
                 xytext=(s + 2, 0.5),
                 arrowprops={'arrowstyle': '->'});
    plt.annotate(s=round(smallerdata[s], 2),
                 xy=(s, smallerdata[s]),
                 xytext=(s + 2, 0.3),
                 arrowprops={'arrowstyle': '->'});
    plt.show();

try:
    import ipywidgets
    from IPython.display import display
    slider = ipywidgets.interactive(updatePlot, s=(0, len(data) - 1, 1));
    display(slider)
except:
    drawPlot()

答案 1 :(得分:1)

!jupyter nbextension list

将是一种从笔记本内部获取启用扩展列表的方法,例如,您可以获取输出并查看字符串是否存在

import subprocess
output = subprocess.getoutput('jupyter nbextension list')
if 'jupytext/index enabled' not in output:
    logging.error('jupytext is not active')