IPython %run magic -n 开关不起作用

blo*_*ley 7 python ipython ipython-magic jupyter-notebook

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

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

IPython 文档指出,当%run -n使用 switch 时:

__name__不是设置为__main__,而是设置为不带扩展名的运行文件的名称(就像 python 在导入时所做的那样)。这允许运行脚本并重新加载其中的定义,而无需调用受if __name__ == "__main__"子句保护的代码。

然而,它似乎对我不起作用。我试过这个:

sub_notebook.ipynb

print(__name__)
Run Code Online (Sandbox Code Playgroud)

parent_notebook.ipynb

%run -n sub_notebook.ipynb
Run Code Online (Sandbox Code Playgroud)

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

请让我知道如何根据代码sub_notebook.ipynb是单独运行还是使用来选择性地运行代码%run

我正在运行 IPython 版本 6.1.0

blo*_*ley 4

%run 的源代码设置了__file__变量,以便我们可以对此进行测试。

我们可以这样写sub_notebook.ipynb

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

except NameError:
    print('I am not in an imported notebook')
Run Code Online (Sandbox Code Playgroud)

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

我们可以创建一个父笔记本,parent_notebook.ipynb其中包含:

%run sub_notebook.ipynb
Run Code Online (Sandbox Code Playgroud)

正确运行会打印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
Run Code Online (Sandbox Code Playgroud)

然后可以保护不应该在父笔记本中打印的代码:

if not has_parent():
    print('This will not print in the parent notebook')
Run Code Online (Sandbox Code Playgroud)