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
%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)
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |