【发布时间】:2013-11-07 13:10:36
【问题描述】:
我一直在使用来自this example 的一些非常好的代码来运行另一个 ipython 笔记本,我(基本上)将其复制在下面。事实证明,这是一种组织代码的好方法。
但是现在,我想将我编写的一些 sympy 表达式与其他人编写的大致等效的 sympy 表达式进行比较。而且由于存在一些名称冲突,我希望能够在它们自己的命名空间中执行这两个笔记本,这样如果 Bob 和我都定义了一个 sympy 表达式x,我就可以评估
Bob.x - Me.x
查看它们是否相同(或找出它们的差异)。 [请注意,使用 this Bunch object 之类的东西很容易将命名空间字典更改为“dottable”命名空间。]
函数如下:
def exec_nb(nbfile):
from io import open
from IPython.nbformat import current
with open(nbfile) as f:
nb = current.read(f, 'json')
ip = get_ipython()
for cell in nb.worksheets[0].cells:
if cell.cell_type != 'code':
continue
ip.run_cell(cell.input)
基本问题是get_ipython 获取当前运行的 ipython 实例,然后run_cell 执行该实例当前命名空间中其他笔记本的单元格。
我不知道如何改变这一点。例如,在 exec 中使用不同的命名空间运行整个命令仍然会找到当前的 ipython 实例,并使用该命名空间。
另外,两个笔记本实际上都需要在 ipython 中运行;我无法将它们导出到脚本并在命名空间中执行脚本。
【问题讨论】:
-
谢谢!这看起来正是我想要的。