IPython %run magic -n开关不工作

emeijp43  于 2023-01-12  发布在  Python
关注(0)|答案(2)|浏览(291)

我正在使用另一个(父)笔记本中的%run magic来运行IPython笔记本。
如果使用%run调用子笔记本,我希望隐藏子笔记本中的一些输出,并且我认为可以通过测试if __name__ == '__main__'来实现这一点
IPython文档指出,当使用%run -n开关时:
__name__没有被设置为__main__,而是被设置为运行文件的名称,没有扩展名(就像python在import中所做的那样)。这允许运行脚本并重新加载其中的定义,而无需调用受if __name__ == "__main__"子句保护的代码。
然而,这似乎对我不起作用。我试了一下:
sub_notebook.ipynb中:

print(__name__)

parent_notebook.ipynb中:

%run -n sub_notebook.ipynb

这将打印__main__,但文档中说它应该打印sub_notebook
请您告诉我如何根据代码是单独运行还是使用%run来选择性地运行sub_notebook.ipynb中的代码?
我正在运行IPython版本6.1.0

gmxoilav

gmxoilav1#

%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')
qxgroojn

qxgroojn2#

在子笔记本sub_notebook.ipynb的开头:
run_all_examples_display_all_outputs = '__file__' not in locals()
同样在子笔记本中,每当您有一些东西只想在运行子笔记本时运行,而不想在“导入”子笔记本时运行:
if run_all_examples_display_all_outputs: plt.show()

相关问题