web-dev-qa-db-ja.com

さまざまなIPythonノートブックのコードを再利用する

私はIPythonを使用しており、1つのノートブックから別のノートブックの関数を実行したい(異なるノートブック間で関数をカットアンドペーストせずに)。これは可能であり、合理的に簡単ですか?

44
user7289

Qtconsoleを使用して同じカーネルに接続できます。起動時にこれを指定するだけです:

ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json

長い文字列のノートブックを起動した後、出力を見てください。

3
Mike Müller

以下を使用してノートブックサーバーを起動します。

ipython notebook --script

ノートブックを保存します(.ipynb)as Python scripts(.py)同様に、インポートすることができます。

または、以下をご覧ください: http://nbviewer.ipython.org/5491090/ これには2つのノートブックが含まれており、一方が他方を実行しています。

35
Matt

IPython 2.0では、単に%run 'my_shared_code.ipynb'ノートブック間でコードを共有します。たとえば http://nbviewer.ipython.org/Gist/edrex/9044756 を参照してください。

22
Eric Drechsel

Ipythons %run magicを使用すると、ノートブックでpythonファイルとipythonスクリプトを実行できます。時々-iオプションを使用して、ノートブックネームスペースで実行します。詳細については、%run?を含むセルを実行します。

ipython --scriptを使用して、ノートブックを各保存時に.pyファイルとして保存することも、同じ効果を得るためにc.NotebookManager.save_script=Trueファイルのipython_notebook_config.py行を保存またはコメント解除することもできます(設定するにはipython profile createを使用します-Ubuntuではconfigファイルが~/.config/ipython/にあります)。

Edit:以下は真実ですが、不要です-%runを直接.ipynbファイルにできます。ありがとう Eric

インポートするノートブックでipythonマジックを使用する場合、.pyファイルの名前を.ipy(ipythonスクリプト)に変更できることがわかりましたが、機能するために最初の行(ファイルエンコーディング宣言を含む)を削除する必要がありました。おそらくもっと良い方法があります!このアプローチは、セルマジックも混乱させる可能性があります(それらはすべて一度に適用されます)。

14
drevicko

「書き込みおよび実行」拡張機能もあります。これにより、セルのコンテンツをファイルに書き込み(古いコンテンツを置き換え->コードを更新)、別のノートブックにインポートできます。

https://github.com/minrk/ipython_extensions#write-and-execute

1つのノートブック(2つのセル)

%reload_ext writeandexecute
--
%%writeandexecute -i some_unique_string functions.py
def do_something(txt):
    print(txt)

そして、他のノートブックで:

from functions import do_something
do_something("hello world")
4
Jan Katins

はい、できます "あるノートブックから別のノートブックで機能を実行します(異なるノートブック間でカットアンドペーストせずに)"-そして、はい、それは簡単です行う!

tl; dr: python files(*.py)ファイルシステムで、複数のノートブックで同じコードを使用できるようにします。 (それは簡単です。)

(コードを読み書きするのに非常に優れた完全に優れたコードエディタとIDEがあるのに、なぜノートブックに大量のコードを入れるのですか?適切なバージョン管理の必要性は言うまでもありません!達成しようとしていますが、どのような費用がかかりますか?</rant>

詳細:

  • 通常のpythonファイル、たとえばmy_code/foo.py、(おそらく空)を追加my_code/__init__.py
  • 適切なバージョン管理下にあるコード(たとえばgit)を利用してください。ipynbjsonファイルを比較するのがどれほど難しいか気づいていますか?
  • また、ノートブックもバージョン管理下に置きます。生のgitログは読みにくいですが、コメントが役立つ場合があります。 (GitHub/GitLabはipythonノートブックを表示します。)
  • Ipynbノートブックのpyソースを少量の「ドライバー」コード、出力、およびドキュメントに制限します。
  • 外部のpythonファイルを「インライン化」したい場合は、(たとえば)magic %cat my_code/foo.py ...

...そのソースをインラインで表示する(オプションで、外部の再利用可能なソースファイルに以下を追加する)より洗練されたものが必要な場合...

import IPython
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_for_filename

filename='my_code/foo.py'
with open(filename) as f: code = f.read()
formatter = HtmlFormatter(linenos='inline')
IPython.display.HTML('<style type="text/css">{}</style>{}'.format(
                formatter.get_style_defs('.highlight'),
                highlight(code, get_lexer_for_filename(filename), formatter)))

お気に入りのコードエディタとIDEは、サポートに感謝します。

2
michael

ソースノートブックから関数またはアクションをロードするノートブックで次の関数を使用します。

import io
import nbformat

def execute_notebook(nbfile):
    with io.open(nbfile, encoding="utf8") as f:
        nb = nbformat.read(f, as_version=4)

    ip = get_ipython()

    for cell in nb.cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

次のように使用します:

execute_notebook(path/to/notebook.ipynb)
1
Mattijn

他のノートブックからノートブックを呼び出します。次のトリックを使用して、「パラメーター」を他のノートブックに渡すこともできます。

配置params辞書最初のセル内 "report_template.ipynb"。

params = dict(platform='iOS', 
              start_date='2016-05-01', 
              retention=7)
df = get_data(params ..)
do_analysis(params ..)

そして、別の(より高い論理レベルの)ノートブックで、次の関数を使用して実行します。

def run_notebook(nbfile, **kwargs):
    """
    example:
    run_notebook('report.ipynb', platform='google_play', start_date='2016-06-10')
    """

    def read_notebook(nbfile):
        if not nbfile.endswith('.ipynb'):
            nbfile += '.ipynb'

        with io.open(nbfile) as f:
            nb = nbformat.read(f, as_version=4)
        return nb

    ip = get_ipython()
    gl = ip.ns_table['user_global']
    gl['params'] = None
    arguments_in_original_state = True

    for cell in read_notebook(nbfile).cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

        if arguments_in_original_state and type(gl['params']) == dict:
            gl['params'].update(kwargs)
            arguments_in_original_state = False

run_notebook("report_template.ipynb", start_date='2016-09-01')

このコマンドは、「report_template」ノートブックの各セルを実行し、params dictionary starting 2番目のセルから

1
volodymyr

@MikeMullerの良いアイデアはローカルのノートブックでは機能しますが、リモートのノートブックでは機能しません(右?)。リモートサーバー上でipynbコードの個々のセルブロックまたは関数をリモートで呼び出して、結果を通信するためにかなり異常なコードを実行しない限り、プログラムで呼び出しルーチンに結果を戻すことができる方法はないと思います。

@Mattが同じアイデアを提出したとき、私は執筆中だった

_ipython <URI_to_Notebook> --script_

* .pynbはJSONコンテナであり、実際のpythonスクリプトではありません。ipythonで* .pyをエクスポートするには、

ターゲット* .ipynbが制御していないリモートマシン上にある場合、出力をローカルパスに書き込むことができるように、おそらくファイルをプルする必要があります。 (リモートリソースでこれを呼び出してローカル出力を作成できるかどうかは検討していません。)これが作成されると、*。pyまたはその中の個々の関数をインポートして実行できるはずです。

io.open(nbfile)を使用して別の* .ipynbファイルを実行するというきちんとした例の@Mattに対する質問は、nbfileをリモートにできるかどうかです。ロングショットのようですが、素晴らしいでしょう...

0
Roland

次に、2つの追加のヒントを示します。

  1. また、ノートブックから%qtconsole magicを直接実行すると、ノートブックカーネルに自動的に接続されます。

  2. チェックアウト https://github.com/atiasnir/ipnb

    それを使用して、ノートブックファイルを標準のpythonモジュール(私は著者です:-))のようにインポートできます。ここでの主な制限は、マジックセルを破棄することです(IPythonをまったく使用しないため)が、それ以外は正常に動作するはずです。

0
atiasnir