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

Posted

技术标签:

【中文标题】IPython notebook:如何编写可以访问笔记本变量的单元魔术?【英文标题】:IPython notebook: How to write cell magic which can access notebook variables? 【发布时间】:2015-04-23 12:50:48 【问题描述】:

我的问题是:如何编写一个可以访问 IPython 笔记本命名空间的 IPython 单元魔术?

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 notebook 中定义 Pandas Series 对象。

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

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

%%p
ts * 3
ts + 1

此代码失败并出现以下错误:

NameError: name 'ts' is not defined

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

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

【问题讨论】:

【参考方案1】:

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

from IPython.core.magic import Magics

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

查看它在代码示例中的使用方式:here 和 here。

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢马特,非常有帮助!

以上是关于IPython notebook:如何编写可以访问笔记本变量的单元魔术?的主要内容,如果未能解决你的问题,请参考以下文章

服务器(Ubuntu)远程访问ipython notebook(服务器运行ipython notebook 本地浏览器访问)

可以在不使用内联绘图的情况下远程访问 IPython Notebook 吗?

Jupyter Notebook(iPython)

如何向IPython Notebook中导入.py文件

如何安装ipython notebook

使用notebook 笔记