2015-11-03 12 views
21

Ich habe ein ipython Notebook mit gemischten markdown und python Zellen.Lesen Zelle Inhalt in einem Ipython-Notebook

Und ich möchte einige meiner python Zellen die angrenzenden markdown Zellen lesen und sie als Eingabe verarbeiten.

Ein Beispiel für die gewünschte Situation:

CELL 1 (Abschlag): select * from tbl where x=1

CELL: SQL-Code

Zelle 2 (Abschlag) auszuführen 3 (Python): mysql.query(ipython.previous_cell.content)

(Die Syntax ipython.previous_cell.content besteht aus)

Executing "CELL 3" sollte

zu mysql.query("select * from tbl where x=1") gleichwertig Wie dies geschehen kann?

+1

Ich würde mit der Frage beginnen "Kann dies getan werden?". Ich denke nicht, dass das offensichtlich ist. – cel

+0

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 –

+1

Darf ich fragen, was willst du damit erreichen? –

Antwort

13

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.

+0

Ich habe keine Notwendigkeit für diese spezielle Lösung, aber das sind großartige Informationen über IPython-Magie, danke! – alexis

Verwandte Themen