web-dev-qa-db-ja.com

IPython Notebook-セルからの早期終了

IPython Notebookの早い段階でプログラムでセルを終了したいと思います。ただし、exit(0)はカーネルを強制終了します。

これを行う適切な方法は何ですか?セルを分割したり、手動で実行を停止したりしないでください。

43
watsonic

here から回答を再投稿しています。なぜなら、解決策はあなたの質問にも当てはまるからです。そうなる...

  • 終了時にカーネルを強制終了しません
  • 完全なトレースバックを表示しない(IPython Shellで使用するトレースバックはありません)
  • try/exceptsを使用してコードを固定するように強制しないでください
  • iPythonの有無にかかわらず、コードを変更せずに動作します

「exit」を下のコードからjupyterノートブック(IPythonノートブック)にインポートするだけで、「exit()」の呼び出しが機能するはずです。終了し、それを知らせます...

 An exception has occurred, use %tb to see the full traceback.

 IpyExit 

"""
# ipython_exit.py
Allows exit() to work if script is invoked with IPython without
raising NameError Exception. Keeps kernel alive.

Use: import variable 'exit' in target script with
     'from ipython_exit import exit'    
"""

import sys
from io import StringIO
from IPython import get_ipython


class IpyExit(SystemExit):
    """Exit Exception for IPython.

    Exception temporarily redirects stderr to buffer.
    """
    def __init__(self):
        # print("exiting")  # optionally print some message to stdout, too
        # ... or do other stuff before exit
        sys.stderr = StringIO()

    def __del__(self):
        sys.stderr.close()
        sys.stderr = sys.__stderr__  # restore from backup


def ipy_exit():
    raise IpyExit


if get_ipython():    # ...run with IPython
    exit = ipy_exit  # rebind to custom exit
else:
    exit = exit      # just make exit importable
14
Darkonaut

もう少し「適切な」オプション:

これにより、最悪のtry/exceptブロック以外のすべてから抜け出します。

raise KeyboardInterrupt

あなたの少しきれいなバージョン:

assert(False)

または単に:

raise

いくつかのキーストロークを保存したい場合。

23
Paul

これは「適切」とはほど遠いですが、早期に終了する1つの方法は、ランタイムエラーを作成することです。したがって、exit(0)を使用してスクリプトから早期にきれいに戻る代わりに、

print(variable_to_query)
() + 1

この時点までコードを実行し(printステートメントを完了)、失敗します。

3
watsonic

現在のセルと後続のセルを静かに停止するには:

class StopExecution(Exception):
    def _render_traceback_(self):
        pass

raise StopExecution
2
Samuel Rizzo