IPython %运行 magic -n 开关不工作

IPython %run magic -n switch not working

我正在 运行通过在另一个(父)笔记本中使用 %run 魔法来创建一个 IPython 笔记本。

如果使用 %run 调用,我想隐藏子笔记本中的一些输出,我认为我可以通过测试 if __name__ == '__main__'

来做到这一点

IPython 文档说,当使用 %run -n 开关时:

__name__ is NOT set to __main__, but to the running file's name without extension (as python does under import). This allows running scripts and reloading the definitions in them without calling code protected by an if __name__ == "__main__" clause.

但是,它对我来说似乎不起作用。我试过这个:

sub_notebook.ipynb中:

print(__name__)

parent_notebook.ipynb中:

%run -n sub_notebook.ipynb

这会打印 __main__ 但文档说它应该打印 sub_notebook.

请告诉我如何在 sub_notebook.ipynb 中选择性地 运行 编码,具体取决于它是单独 运行 还是使用 %run

我正在 运行宁 IPython 版本 6.1.0

source code to %run 设置了 __file__ 变量,因此我们可以对此进行测试。

我们可以写成sub_notebook.ipynb:

try:
    __file__
    print('I am in an imported notebook')

except NameError:
    print('I am not in an imported notebook')

运行 单独打印 I am not in an imported notebook

我们可以创建父笔记本 parent_notebook.ipynb 包含:

%run sub_notebook.ipynb

运行 正确打印 I am in an imported notebook.

我们可以在sub_notebook.ipynb内编写一个简单的测试:

def has_parent():
    """Return True if this notebook is being run by calling
    %run in another notebook, False otherwise."""
    try:
        __file__
        # __file__ has been defined, so this notebook is 
        # being run in a parent notebook
        return True

    except NameError:
        # __file__ has not been defined, so this notebook is 
        # not being run in a parent notebook
        return False

那么可以保护父笔记本中不应该打印的代码:

if not has_parent():
    print('This will not print in the parent notebook')