我一直在使用这个示例中的一些非常好的代码来运行另一个 ipython 笔记本,我(基本上)将其复制在下面。事实证明,这是一种组织我的代码的好方法。
但是现在,我想将我编写的一些同情表达与其他人编写的大致等效的同情表达进行比较。而且由于存在一些名称冲突,我希望能够在它们自己的命名空间中执行这两个笔记本,这样如果 Bob 和我都定义了一个 sympy 表达式x
,我就可以评估
Bob.x - Me.x
看看它们是否相同(或找到它们的差异)。[请注意,使用此 Bunch 对象之类的东西很容易将命名空间字典更改为“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 中运行;我无法将它们导出到脚本并在命名空间中执行脚本。