2015-11-03 46 views
21

我有一个ipython笔记本电脑与混合markdownpython单元格。阅读ipython笔记本中的单元格内容

而且我希望我的一些python单元读取相邻的markdown单元格并将它们作为输入进行处理。

的期望的情况的一个例子:

CELL 1(降价):SQL代码以执行

CELL 2(降价)select * from tbl where x=1

CELL 3(python)mysql.query(ipython.previous_cell.content)

(语法ipython.previous_cell.content由)

执行 “CELL 3” 应该是相当于mysql.query("select * from tbl where x=1")

如何才能做到这一点?

+1

我首先要问'可以这样做吗?'。我不认为这是显而易见的。 – cel

+0

可以这样或那样的方式,我们总是可以自己尝试和解释'.ipynb'格式,并阅读单元格内容 –

+1

我可以问一下,你想用这个来实现什么? –

回答

13

我认为你试图以错误的方式攻击问题。

首先是的,它可能会让相邻的减价单元变得非常黑客,在无头笔记本执行中不起作用。

你想要做的是使用IPython单元格魔术,只要单元格以2个百分号开头,后面跟一个标识符,它就允许任意语法。

通常你想要SQL单元格。

您可以参考相关文档有关cells magics 或者我可以告诉你如何建立一个:

from IPython.core.magic import (
    Magics, magics_class, cell_magic, line_magic 
) 

@magics_class 
class StoreSQL(Magics): 


    def __init__(self, shell=None, **kwargs): 
     super().__init__(shell=shell, **kwargs) 
     self._store = [] 
     # inject our store in user availlable namespace under __mystore 
     # name 
     shell.user_ns['__mystore'] = self._store 

    @cell_magic 
    def sql(self, line, cell): 
     """store the cell in the store""" 
     self._store.append(cell) 

    @line_magic 
    def showsql(self, line): 
     """show all recorded statements""" 
     print(self._store) 

    ## use ipython load_ext mechanisme here if distributed 
    get_ipython().register_magics(StoreSQL) 

现在你可以在你的Python细胞利用SQL语法:

%%sql 
select * from foo Where QUX Bar 

第二cell:

%%sql 
Insert Cheezburger into Can_I_HAZ 

检查我们执行了什么(3 dashe S显示输入/输出划界,你不必键入它们):

%showsql 
--- 
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ'] 

而你在你的问题问开头:

mysql.query(__mystore[-1]) 

当然,这要求你执行先前的单元格按正确的顺序排列,但没有什么能阻止您使用%%sql语法命名您的单元格,例如,如果_storedict或更好的类别,那么您将覆盖__getattr__,以便像__getitem__那样操作以使用点语法来访问字段。这是作为练习留给读者,或看看到底响应:

@cell_magic 
def sql(self, line, cell): 
    """store the cell in the store""" 
    self._store[line.strip()] = cell 

然后你可以使用SQL细胞像

%%sql A1 
set foo TO Bar where ID=9 

然后在你的Python细胞

mysql.execute(__mystore.A1) 

我也强烈建议在GitHub上看看Catherine Develin SqlMagic的IPython和这个Notebook gist,这些都显示了这一切。

在评论中,你似乎想说要添加pig,没有什么能阻止你拥有魔法。也可以注入Javascript来启用SQL和PIG的正确语法高亮显示,但这超出了这个问题的范围。

+0

我不需要这个特定的解决方案,但是这是关于IPython magics的很好的信息,谢谢! – alexis