web-dev-qa-db-ja.com

IPython Notebookの実行中に特定のセルを(断続的に)スキップする方法は?

以前に定義した変数にアクセスして作業を続けるために、通常、ノートブックを開くときに(ほとんどの部分)を再実行する必要があります。

ただし、後続のセルに影響を及ぼさず(実行中の分析のブランチを構成する場合がある)、実行に非常に長い時間がかかる可能性がある一部のセルをスキップしたい場合があります。これらのセルはノートブック全体に散らばっている可能性があるため、「下にすべて実行」のようなものはあまり役に立ちません。

これを達成する方法はありますか?

理想的には、これらのセルにいくつかの特別なフラグを付けて、手動で「実行」することはできても、「すべて実行」するとスキップされるようにすることができます。

[〜#〜]編集[〜#〜]

@Jakobによって提案された_%%cache_(ipycache拡張機能)は、問題をある程度解決します。

実際、再実行するときに変数をロードする必要すらありません(大きい可能性がありますが、後続のセルには不要です)。分析結果として保存される出力のみが重要です。

回避策として、_%%cache folder/unique_identifier_をセルの先頭に配置します。コードは1回だけ実行され、unique_identifierファイルを削除しない限り、再実行時に変数は読み込まれません。

残念ながら、_%%cache_...で再実行すると、すべての出力結果が失われます.

編集II(2013年10月14日)

Ipython + ipycacheのマスターバージョンは、コードセルの出力も同様にピクル(および再表示)します。

Latex、HTML(pandas DataFrame出力)を含むリッチディスプレイ出力の場合、IPythonのdisplay()メソッドを使用することを忘れないでください。例:display(Latex(r'$\alpha_1$'))

37
herrlich10

現在、IPython Notebookにはそのような機能は含まれていません。それにもかかわらず、あなたの人生を楽にするいくつかの可能性があります、例えば:

  • %storeを使用するか、%%cacheマジック(拡張)を使用して、これらのセルの結果を断続的に格納します。これにより、セルを再計算する必要がなくなります( https:// github。 com/rossant/ipycache

  • 実行したくないセルの前にif==0:を追加します

  • これらのセルを生のセルに変換します(ただし、すでに保存されている出力は失われます!)

https://github.com/ipython/ipython/issues/2125 での議論を参照)

ヤコブ

32
Jakob

これは正確にあなたが探しているように見えるものではありませんが、セルの実行を完全に省略したい場合(キャッシュされた結果がロードされない場合)は、セルの先頭に次のハックを追加できます( UNIXベースのOSを使用):

%%script false 

またはバリアント(2020年の初めの時点で機能-説明は こちら を参照):

%%script false --no-raise-error
37
Mark

キャッシュされた結果がロードされると予想されない場合、Freeze nbextensionがこの目的に非常に役立ちます。

enter image description here

非公式ですが、これらのノートブック拡張機能を初めて使用する場合は、ぜひお試しください。

延長機械を取り付けるには、

$ pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

Freeze拡張機能を有効にするには、jupyter notebookを起動して新しいノートブックを開き、メニューからEdit> nbextensions configを選択して、Freezeを確認します。

0
herrlich10

%%script falseソリューションは2019年中に機能しなくなりました。

他に利用可能な回避策があります。これらは、何も期待しないように指示するときに引数を無視するプログラムに基づいています。簡単な例をいくつか示します。

Perl:

%%Perl -e0
​
for i in range(10): print(i)

ここで実行しています:Perl -e '0' cellcontents

より記憶に残るバージョン:

%%Perl -eat
​
for i in range(10): print(i)

ここで実行しています:Perl -e 'at' cellcontents

バッシュ:

%%bash -c :

for i in range(10): print(i)

':'はbashのnoopなので、実行しています:bash -c : cellcontents

私は外部マジック実装コードを見ていませんが、「cellcontents」が引数として渡され、誤ってShellによって解釈されないことを確信しています。それらの中に誤っていくつかの悪いコードを挿入します。しかし、それを保証することはできません。

ここでサポートされているプログラムを見ると、他のクリエイティブなソリューションを思い付くことができると思います: https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics =

0
stason