5

いくつかのシェル コマンドとその入力を含む IPython ノートブックをまとめたいと考えています。bash プロンプトでは、「here-document」構文を使用できます。

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

IPython、特にjupyterノートブックで同じ効果を得るにはどうすればよいですか? 「ラインマジック」または「セルマジック」としてIPythonとしてシェルコマンドを実行する方法を知っています。

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

IPython を system shell として調べました。これは、いくつかの構文上の優れた点を有効にする方法を示しています。以下の後、前置!または追加せずにシステムコマンドを実行できます!!

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

しかし、これはこれらのコマンドにインラインで入力を提供するのに役立ちません: ヒアドキュメント構文は IPython では無効であり、結果は python になりSyntaxErrorます。では、どうすればいいですか?

4

2 に答える 2

5

さらに調査を行い、@ThomasK のヒント (受け入れられた回答を参照) の助けを借りて、これを行う方法をいくつか見つけました。

  • 解決策の一つがセルマジックだ%sx。セルの内容を bash スクリプトとして実行し、出力を取得して行のリストとして返します。便利な場合もあれば、そうでない場合もあります。

    In[1]:  %%sx
            echo Hello, world
            cat -n <<DATA
            this
            and that
            DATA
    
    Out[1]: ['Hello, world', '     1\tthis', '     2\tand that']
    
  • %%bash提案されているように、それを に変更する@ThomasKと、出力は返されずに出力されます。さらに処理するためにそれをキャプチャするにipythonは、パラメータを提供し--outます。しかし、それを自分で印刷する必要があります。デフォルトでは表示されません。

    In[1]:  %%bash --out var
            echo Hello, world
            echo "   Again"
    
    In[2]:  var
    
    Out[2]: 'Hello, world\n   Again\n'
    
  • %%bashは実際には の省略形であり、 「スクリプト内%%script bashの行のように」機能するものとして請求されます ( のヘルプを参照してください)。それは何をしますか。そこで、ヒアドキュメントの構文を省略して、任意のプログラムにセルの内容を入力として読み込ませる方法を次に示します。パラメータも受け入れます。#!%%script?%%script--out

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

これで十分ですが、私のユースケースmysqlipython-sql.

%load_ext sql
%sql mysql+pymysql://user:passwd@localhost/somedb

これは、拡張機能をインストールすることを前提としていpip install ipython-sqlます。のためmysqlに、私も必要でしpip install pymysqlた。上記のセットアップの後、次のようにデータベースと対話します

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

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

返されたテーブルは、実際には境界線のあるノートブック テーブルとして描画されます。これはちょっといいですね。そして、Pandas データフレーム (スマート リスト) として利用できるようになり、_.

于 2016-05-18T14:55:06.440 に答える