IPython%运行魔法-n开关无法正常工作

时间:2018-01-02 20:38:40

标签: python ipython jupyter-notebook ipython-magic

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

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

来执行此操作

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

  

__name__未设置为__main__,而是设置为没有扩展名的正在运行的文件名(如导入时的python一样)。这允许跑步   脚本并在不调用代码的情况下重新加载它们中的定义   受if __name__ == "__main__"条款保护。

然而,它似乎并不适合我。我试过这个:

sub_notebook.ipynb

print(__name__)

parent_notebook.ipynb

%run -n sub_notebook.ipynb

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

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

我正在运行IPython版本6.1.0

1 个答案:

答案 0 :(得分: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')