Ich denke, Sie versuchen, das Problem auf die falsche Weise anzugreifen.
Zuerst ja, es ist möglich, die angrenzende Marktzelle in wirklich hackischer Weise zu bekommen, die bei der kopflosen Notebook-Ausführung nicht funktionieren würde.
Was Sie tun möchten, ist die Verwendung von IPython-Zellenmagie, die beliebige Syntax erlauben, solange die Zelle mit 2 Prozentzeichen gefolgt von einem Bezeichner beginnt.
Normalerweise möchten Sie SQL-Zellen.
Sie können in der Dokumentation über cells magics oder ich kann Ihnen zeigen, wie das bauen:
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)
Jetzt können Sie SQL-Syntax in Ihrer Python-Zellen verwenden:
%%sql
select * from foo Where QUX Bar
eine zweite Zelle:
%%sql
Insert Cheezburger into Can_I_HAZ
überprüfen Sie, was wir ausgeführt haben (die 3 dashe s zeigen die Eingabe/Ausgabe-Begrenzung, Sie müssen sie nicht geben):
%showsql
---
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ']
Und was man am Anfang in Frage gestellt:
mysql.query(__mystore[-1])
Dies ist natürlich nicht erforderlich, dass Sie ausführen die vorherigen Zellen in der richtigen Reihenfolge, nichts hindert Sie an der Verwendung der %%sql
Syntax, um Ihre Zellen zu benennen, zB wenn _store
ist eine dict
, oder besser eine Klasse, in der Sie __getattr__
überschreiben, um wie __getitem__
zu handeln, um Felder mit Punktsyntax zugreifen.Dies wird den Leser als Übung oder Ende sehen, die von der Antwort:
@cell_magic
def sql(self, line, cell):
"""store the cell in the store"""
self._store[line.strip()] = cell
Sie dann SQL-Zelle wie
%%sql A1
set foo TO Bar where ID=9
Und dann in Ihren Python-Zellen
mysql.execute(__mystore.A1)
verwenden können
Ich würde auch empfehlen Catherine Develin SqlMagic für IPython, und diese Notebook gist auf GitHub, die das alles live zu zeigen.
In dem Kommentar scheinen Sie sagen, Sie möchten pig
hinzufügen, nichts hindert Sie daran, eine %%pig
Magie weder. Es ist auch möglich, Javascript einzuschleusen, um die korrekte Syntax-Hervorhebung von SQL und PIG zu aktivieren, aber das würde den Rahmen dieser Frage sprengen.
Ich würde mit der Frage beginnen "Kann dies getan werden?". Ich denke nicht, dass das offensichtlich ist. – cel
Es ist möglich auf die eine oder andere Weise, wir können immer versuchen, das '.ipynb' Format selbst zu interpretieren, und lesen Sie den Inhalt der Zelle –
Darf ich fragen, was willst du damit erreichen? –