我一直在使用来自this example的一些非常好的代码从另一个运行一个ipython笔记本,我(基本上)在下面复制。这是组织我的代码的一种非常好的方式。
但是现在,我想比较一些我用其他人已编码的大致相当的同情表达编码的同情表达。由于存在一些名称冲突,我希望能够在自己的命名空间中执行这两个笔记本,因此如果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中运行;我无法将它们导出到脚本并在命名空间中执行脚本。