IPython notebook:如何编写可以访问笔记本变量的单元魔法?

时间:2015-02-21 23:42:05

标签: python ipython ipython-notebook

我的问题是:如何编写可以访问IPython笔记本命名空间的IPython cell magic?

IPython允许编写用户定义的单元格魔法。我的计划是创建一个绘图函数,它可以绘制一个或多个任意Python表达式(基于Pandas Series对象的表达式),其中单元格字符串中的每一行都是图表中的单独图形。

这是细胞魔法的代码:

def p(line, cell):
    import pandas as pd
    import matplotlib.pyplot as plt

    df = pd.DataFrame()
    line_list = cell.split('\n')

    counter = 0
    for line in line_list:
        df['series' + str(counter)] = eval(line)      
        counter += 1

    plt.figure(figsize = [20,6])
    ax = plt.subplot(111)
    df.plot(ax = ax)


def load_ipython_extension(ipython):
    ipython.register_magic_function(p, 'cell')

该函数以字符串形式接收整个单元格内容。然后,该字符串由换行符拆分,并使用eval()进行评估。结果将添加到Pandas DataFrame中。最后,使用matplotlib绘制DataFrame。

用法示例:首先在IPython笔记本中定义Pandas Series对象。

import pandas as pd
ts = pd.Series([1,2,3])

然后在IPython笔记本中调用魔法(下面的整个代码是一个单元格):

%%p
ts * 3
ts + 1

此代码失败,并显示以下错误:

NameError: name 'ts' is not defined

我怀疑问题是p函数只接收ts * 3\n ts + 1作为字符串,并且它无法访问IPython笔记本的命名空间中定义的ts变量(因为p函数在单独的.py文件中定义。)

我的代码如何更改,以便cell magic可以访问IPython笔记本中定义的ts变量(因此不会因NameError而失败)?

2 个答案:

答案 0 :(得分:5)

使用@needs_local_scope decorator装饰器。文档有点缺失,但您可以看到how it is used,欢迎提供文档。

答案 1 :(得分:0)

您还可以使用Magics中的shell.user_ns。例如:

from IPython.core.magic import Magics

class MyClass(Magics):
    def myfunc(self):
        print(self.shell.user_ns)

了解它在代码示例中的用法:herehere