将 ipython notebook 转换为可直接执行的 python 脚本
Convert ipython notebook to directly-executable python script
我有一个 jupyter/ipython
笔记本,用于原型制作和辅导。
我使用下拉菜单或 nbconvert
将其导出为 python 脚本,即
ipython nbconvert --to python notebook.ipynb
但是,我想直接使 notebook.py
可执行,而不必每次都手动破解它,以便我可以继续更新 notebook.ipynb
并用我的代码覆盖 notebook.py
变化。我还想在 notebook.py
中包含命令行参数。例如,我的样板是:
#!/usr/bin/env ipython
import sys
x=sys.argv[-1]
当然还有 chmod +x notebook.py
。
一种方法是在 jupyter/ipython
笔记本中忽略这些行(无论是 python 还是命令行指令)- 有没有办法通过例如检测 jupyter/ipython
环境?
Edit1: 这等于说:
如何在 notebook.ipynb
中包含在笔记本环境中将被忽略但在从中生成的 notebook.py
中解析的行?
Edit2: 这个问题是部分答案,但没有告诉我如何包含 #!/usr/bin/env ipython
行:How can I check if code is executed in the IPython notebook?
Edit3: 可能会有用,但前提是 %%bash /usr/bin/env ipython
会起作用 - 它会..?
Edit4: 另一个尝试的答案(微妙):由于 #
是 python 中的注释,因此将 #!/usr/bin/env ipython
放在第一个单元格中notebook 意味着它将在 jupyter/ipython
中被忽略,但在导出的 notebook.py
中受到尊重。但是,#!
指令不在顶部,但很容易被砍掉:
> more notebook.py
# coding: utf-8
# In[1]:
#!/usr/bin/env ipython
# In[2]:
print 'Hello'
# In[ ]:
答案很简单。
第 1 部分 - 使导出的 notebook.py 直接可执行:
如here所述,nbconvert
可以使用任意模板进行自定义。
因此创建一个文件 hashbang.tpl
包含:
#!/usr/bin/env ipython
{% extends 'python.tpl'%}
然后在命令行执行:
jupyter nbconvert --to python 'notebook.ipynb' --stdout --template=hashbang.tpl > notebook.py
嗨,转眼间:
> more notebook.py
#!/usr/bin/env ipython
# coding: utf-8
# In[1]:
print 'Hello'
...
第 2 部分 - 检测笔记本环境:
的回答应该可以,即使用以下函数测试笔记本环境:
def isnotebook():
# From
try:
shell = get_ipython().__class__.__name__
if shell == 'ZMQInteractiveShell':
return True # Jupyter notebook or qtconsole
elif shell == 'TerminalInteractiveShell':
return False # Terminal running IPython
else:
return False # Other type (?)
except NameError:
return False # Probably standard Python interpreter
我有一个 jupyter/ipython
笔记本,用于原型制作和辅导。
我使用下拉菜单或 nbconvert
将其导出为 python 脚本,即
ipython nbconvert --to python notebook.ipynb
但是,我想直接使 notebook.py
可执行,而不必每次都手动破解它,以便我可以继续更新 notebook.ipynb
并用我的代码覆盖 notebook.py
变化。我还想在 notebook.py
中包含命令行参数。例如,我的样板是:
#!/usr/bin/env ipython
import sys
x=sys.argv[-1]
当然还有 chmod +x notebook.py
。
一种方法是在 jupyter/ipython
笔记本中忽略这些行(无论是 python 还是命令行指令)- 有没有办法通过例如检测 jupyter/ipython
环境?
Edit1: 这等于说:
如何在 notebook.ipynb
中包含在笔记本环境中将被忽略但在从中生成的 notebook.py
中解析的行?
Edit2: 这个问题是部分答案,但没有告诉我如何包含 #!/usr/bin/env ipython
行:How can I check if code is executed in the IPython notebook?
Edit3: 可能会有用,但前提是 %%bash /usr/bin/env ipython
会起作用 - 它会..?
Edit4: 另一个尝试的答案(微妙):由于 #
是 python 中的注释,因此将 #!/usr/bin/env ipython
放在第一个单元格中notebook 意味着它将在 jupyter/ipython
中被忽略,但在导出的 notebook.py
中受到尊重。但是,#!
指令不在顶部,但很容易被砍掉:
> more notebook.py
# coding: utf-8
# In[1]:
#!/usr/bin/env ipython
# In[2]:
print 'Hello'
# In[ ]:
答案很简单。
第 1 部分 - 使导出的 notebook.py 直接可执行:
如here所述,nbconvert
可以使用任意模板进行自定义。
因此创建一个文件 hashbang.tpl
包含:
#!/usr/bin/env ipython
{% extends 'python.tpl'%}
然后在命令行执行:
jupyter nbconvert --to python 'notebook.ipynb' --stdout --template=hashbang.tpl > notebook.py
嗨,转眼间:
> more notebook.py
#!/usr/bin/env ipython
# coding: utf-8
# In[1]:
print 'Hello'
...
第 2 部分 - 检测笔记本环境:
的回答应该可以,即使用以下函数测试笔记本环境:
def isnotebook():
# From
try:
shell = get_ipython().__class__.__name__
if shell == 'ZMQInteractiveShell':
return True # Jupyter notebook or qtconsole
elif shell == 'TerminalInteractiveShell':
return False # Terminal running IPython
else:
return False # Other type (?)
except NameError:
return False # Probably standard Python interpreter