我在另一个(父)笔记本中使用%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
答案 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')