2017-08-10 101 views
1

我有用於原型設計和輔導的jupyter/ipython筆記本。將ipython筆記本轉換爲可直接執行的python腳本

我出口它作爲使用菜單下拉或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會工作 - 它會..? How do I provide inline input to an IPython (notebook) shell command?

Edit4:另一個試圖回答(細微):由於#是Python中的評論,把#!/usr/bin/env ipython在筆記本的第一個單元格意味着它將在jupyter/ipython被忽略,但在出口notebook.py尊重。然而,#!指令是不是頂部,但很容易被砍掉:

> more notebook.py 

# coding: utf-8 

# In[1]: 

#!/usr/bin/env ipython 


# In[2]: 

print 'Hello' 


# In[ ]: 
+0

當你直接說,有什麼方法或門戶網站你指的是?你的意思是從Jupyter筆記本? – Landmaster

+0

在* nix命令行上,例如'。/ notebook.py' - 我知道如何做到這一點,但我想(i)導出筆記本,並且(ii)使其可執行,而不必每次都手動破解它,也允許通過例如命令行參數'sys.argv' – jtlz2

+0

我編輯了這個問題 - 編輯是否有意義? – jtlz2

回答

0

答案竟然是相當簡單的。 1

部分 - 使導出notebook.py直接執行:

如上所述herenbconvert可以用任意的模板來定製。

所以創建一個包含文件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部分 - 檢測筆記本環境:

這從https://stackoverflow.com/a/39662359/1021819答案應該這樣做,即使用下列函數來測試筆記本的環境:

def isnotebook(): 
    # From https://stackoverflow.com/a/39662359/1021819 
    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