我认为你正在错误的方向上尝试解决问题。
首先,是可能以一种非常hackish的方式获得相邻的Markdown单元格,但这种方式在无头笔记本执行中不起作用。
你想要做的是使用IPython单元格魔法,只要单元格以两个百分号和一个标识符开头,就允许任意语法。
通常你需要SQL单元格。
你可以参考有关单元格魔法的文档,
或者我可以向你展示如何构建它:
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 = []
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)
get_ipython().register_magics(StoreSQL)
现在您可以在Python单元格中使用SQL语法:
%%sql
select * from foo Where QUX Bar
第二个单元格:
%%sql
Insert Cheezburger into Can_I_HAZ
检查我们执行的内容(三个连字符表示输入/输出分界线,您无需键入它们):
%showsql
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ']
你在问题开头提出的问题:
mysql.query(__mystore[-1])
当然,这需要您按正确顺序执行之前的单元格,但并不妨碍您使用%%sql
语法来为单元格命名,例如,如果_store
是一个dict
,或者更好地说是一个类,您可以重写__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)
我还强烈建议查看Catherine Develin SqlMagic,用于IPython,以及这个GitHub上的Notebook gist,展示了所有这些内容。
在您的评论中,您似乎想添加pig
,没有任何阻碍您使用%%pig
magic。也可以注入JavaScript以启用正确的SQL和PIG语法突出显示,但这超出了本问题的范围。
.ipynb
格式并读取单元格内容。 - Uri Gorensql
、pig
和bash
脚本,而不需要重复编写它们(对于可读的markdown
单元格和执行它们的python
单元格)。 - Uri Goren