2016-05-16 12 views
2

Ich möchte ein IPython-Notebook mit einigen Shell-Befehlen und deren Eingabe zusammenstellen. In der Bash-Eingabeaufforderung kann ich "hier-Dokument" Syntax:Wie stelle ich Inline-Eingaben für einen IPython (Notebook) -Shellbefehl bereit?

bash-3.2$ mysql -u root <<END_IPUT 
> use mydb; 
> show tables; 
> END_INPUT 

Wie kann ich den gleichen Effekt in IPython erhalten, und zwar in einem jupyter Notebook? Ich weiß, wie Shell-Befehle wie IPython als „Linie magics“ oder „Zelle magics“, z.B .:

In [7]: !! ls -tF 
Out[7]: ['Demo-notebook.ipynb', 
      'createdb.sql', 
      ... 

Ich habe sah IPython as a system shell, auszuführen, die zeigt, wie einige syntaktischen Feinheiten zu ermöglichen. Nach dem Folgenden kann ich Systembefehle ausführen, ohne ! oder !! Voranstellen

# Turn everything in $PATH into an alias; 
# then enable calling aliases without ! or % 
%rehashx  
%autocall 2 

Aber nichts hilft mit Eingabe auf diese Befehle Inline-Bereitstellung: Die hier-Dokument Syntax in IPython und die Ergebnisse in einem Python ungültig ist SyntaxError . Also, wie mache ich das?

+0

Haben Sie die Bash-Zelle Magie versucht? Starte eine Zelle mit der Zeile '%% bash' und lege den Bash-Code in den Rest. –

+1

Guter Vorschlag, danke! Ich hatte bereits '%% sx' gefunden, was das gleiche tut, denke ich. Aber die Dokumentation für '% bash' führte mich zu' %% script', was _exactly_ ist, wonach ich gesucht habe. In der Zwischenzeit habe ich auch eine Erweiterung speziell für 'sql' gefunden, die mein unmittelbares Problem noch besser gelöst hat. Aber wenn du eine Antwort schreiben willst, die deinen Vorschlag erweitert, werde ich es akzeptieren. – alexis

+0

@Thomas, bevor Sie mein Tag zum dritten Mal löschen, schauen Sie, wie viele Leute folgen jedem. Wenn [tag: ipython-notebook] ein solches Problem darstellt, nehmen Sie bitte den Prozess auf, um die Tags zusammenzuführen. – alexis

Antwort

3

Die bash cell magic erlaubt es Ihnen, mehrere bash-Linien einzugeben. Starten Sie einfach eine beliebige Zelle mit %%bash:

%%bash 
echo "This is bash" 
ls 

Wenn Sie ein heredoc an Rohr Text in ein anderes Programm verwenden, können Sie auch das Skript Zelle Magie:

%%script bc 
2+3 

Es können auch andere Zelle sein kann Zaubersprüche, die speziell auf dein Problem eingehen!

4

Mit etwas mehr Forschung und mit Hilfe von @ ThomasKs Tipp (siehe akzeptierte Antwort), fand ich ein paar Möglichkeiten, dies zu tun.

  • Eine Lösung ist die Zelle Magie %sx. Sie führt den Zelleninhalt als Bash-Skript aus und erfasst und gibt die Ausgabe als Liste von Zeilen zurück. Manchmal praktisch, manchmal nicht.

    In[1]: %%sx 
         echo Hello, world 
         cat -n <<DATA 
         this 
         and that 
         DATA 
    
    Out[1]: ['Hello, world', '  1\tthis', '  2\tand that'] 
    
  • ändern, die %%bash, wie @ThomasK vorgeschlagen, und die Ausgabe wird ausgedruckt, nicht zurückgegeben. Um es für die weitere Verarbeitung zu erfassen, liefert ipython den --out Parameter. Aber dann muss ich es selbst ausdrucken - es wird standardmäßig nicht angezeigt.

    In[1]: %%bash --out var 
         echo Hello, world 
         echo " Again" 
    
    In[2]: var 
    
    Out[2]: 'Hello, world\n Again\n' 
    
  • %%bash ist eigentlich eine Abkürzung für %%script bash, in Rechnung gestellt als "wie die #! Zeile in einem Skript" (siehe die Hilfe mit %%script?) arbeiten. Was es macht. So, hier ist, wie man auf die hier-Dokument-Syntax verzichtet und jedes Programm den Zellinhalt als Eingabe liest. %%script akzeptiert auch den Parameter --out.

     %%script --out var mysql -u root -p XYZ 
         USE somedb; 
         SELECT * FROM users 
          WHERE passwd IS NULL\G 
    

Das ist schön genug, aber ich am Ende mit ihm nicht, weil mein Anwendungsfall mysql ist, und schließlich entdecken ich, dass es eine große Dritt ipython-sql-Erweiterung, die ich stattdessen verwenden kann:

%load_ext sql 
%sql mysql+pymysql://user:[email protected]/somedb 

Dies setzt voraus, dass die Erweiterung mit pip install ipython-sql installiert wird. Für mysql benötigte ich auch pip install pymysql. Nach der obigen Setup spreche ich nur auf die Datenbank wie diese

In[1]: %%sql 
     SELECT * FROM users 
      WHERE passwd IS NULL 

Out[1]: 1 rows affected. 
     ... 

Die zurückgegebenen Tabelle ist eigentlich als Notebook Tisch gezogen mit Grenzen, die irgendwie schön. Und es wird als Pandas Datenframe (eine Smart List) zur Verfügung gestellt, die ich unter _ abrufen kann.

+0

Könnte ich tun: '%% bash/usr/bin/env ipython', um ein exportiertes' notebook.py' auf der Kommandozeile auszuführen? – jtlz2