Pythonプログラムを実行していて、ジャンプして何が起こっているのかを確認してから再びステップアウトするのに役立つポイントがあります。一時的なコンソールモードのようなものです。
Matlabでは、 keyboard
コマンドを使用してこれを行いますが、Pythonでコマンドが何であるかはわかりません。
これを行う方法はありますか?
例えば:
_for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
_
enter_interactive_mode()
が呼び出されたら、そこに行って見回してから、プログラムを実行し続けます。
code.interact()
は何とか動作するようです:
>>> import code
>>> def foo():
... a = 10
... code.interact(local=locals())
... return a
...
>>> foo()
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10
Ctrl+Z 「メイン」インタープリターに戻ります。
あなたは地元の人たちを読むことができますが、それらを変更してもこのようには機能しないようです。
python -i myapp.py
これによりmyapp.py
が実行され、インタラクティブシェルにドロップされます。そこから、myapp.py
の環境全体(インポートなど)をロードして、関数を実行し、その出力を確認できます。
より洗練されたもののために-pdb
のようなデバッガーを使用して、ブレークポイントを設定する方が良いでしょう。また、ほとんどのIDE(PyDev、PyCharm、Komodo ...)にはグラフィカルデバッガがあります。
この目的で pdb
を使用します。エミルはすでに彼の答えでこれについて言及していたことを知っていますが、彼はあなたの質問に答える理由の例や詳細を述べていませんでした。
_for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
_
感嘆符を付けてコマンドを開始することにより、変数を読み取って設定できます。スタックを上下に移動することもできます(コマンドu
およびd
)。これらにはInteractiveConsole
には組み込みのメカニズムがありません。
プログラムの実行を継続するには、c
コマンドを使用します。上記の例では、ループの繰り返しごとにデバッガーに入るため、if
文でset_trace()
呼び出しをラップすることができます。
オプションがあります-Python=標準ライブラリまたはIPython。
Python標準ライブラリには code
モジュールがあり、そのモジュールには InteractiveConsole
クラスがあり、その目的は「インタラクティブなPythonインタープリターの動作を厳密にエミュレートします。」これはおそらくあなたが望むことをすることができるでしょうが、ドキュメントにはこれを使用する方法の例がありません。どこへ行くかについての提案はありません。
IPython (より高度なPython端末)には、プログラムの任意のポイントにコンソールを組み込むオプションが組み込まれています。 ドキュメント 、あなたは単に行うことができます
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
私にとって最も快適なツールは ipdb です。
ipdbは、IPythonデバッガーにアクセスするための関数をエクスポートします。IPythonデバッガーは、タブ補完、構文の強調表示、優れたトレースバック、pdbモジュールと同じインターフェースによる優れたイントロスペクションを備えています。
完了と便利なイントロスペクションは、デバッグに特に役立ちます。
ipdb
を使用できます。
ブレークポイントを設定するには、
import ipdb; ipdb.set_trace()
をデバッガーにジャンプする場所に追加します。ブレークポイントに達すると、コンテキスト用のインタラクティブなシェルとブレークポイントの周りの数行のコードが表示されます。https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
おそらく最も適切なオプションではありませんが、次のような単純なものです。
try:
while True:
print input()
except:
pass
多くの場合をカバーします