64

私はPythonプログラムを実行していて、何が起こっているのかを確認してから、もう一度ステップアウトすると便利なポイントがあります。一時的なコンソールモードのようなものです。

Matlabでは、keyboardこれを行うためにコマンドを使用しますが、Pythonでのコマンドが何であるかわかりません。

これを行う方法はありますか?

例えば:

for thing in set_of_things:
    enter_interactive_mode_here()
    do_stuff_to(thing)

電話がかかってきたらenter_interactive_mode()、そこに行って周りを見回してから、離れてプログラムを実行し続けたいと思います。

4

7 に答える 7

67

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「メイン」インタプリタに戻ります。

あなたは地元の人を読むことができますが、それらを修正することはこのようには機能しないようです。

于 2012-11-17T17:22:08.357 に答える
58
python -i myapp.py

これにより、実行myapp.pyされ、インタラクティブシェルにドロップされます。そこから、ロードされた環境全体(インポートなど)を使用して、関数を実行し、その出力を確認できますmyapp.py

より洗練されたものについてはpdb、ブレークポイントを設定するなどのデバッガーを使用することをお勧めします。また、ほとんどのIDE(PyDev、PyCharm、Komodo ...)にはグラフィカルデバッガーがあります。

于 2012-11-17T17:07:47.560 に答える
18

pdbはこの目的のために使用します。エミルはすでにこれについて彼の答えで言及していることを私は理解していますが、彼は例を含めたり、なぜそれがあなたの質問に答えるのかについて詳しく述べていませんでした。

for thing in set_of_things:
    import pdb; pdb.set_trace()
    do_stuff_to(thing)

コマンドを感嘆符で開始することにより、変数を読み取って設定できます。スタックを上下に移動することもできます(コマンドud)。これには、実行InteractiveConsoleするメカニズムが組み込まれていません。

プログラムの実行を継続するには、cコマンドを使用します。上記の例では、ループが繰り返されるたびにデバッガーに入るため、set_trace()呼び出しをif文でラップすることをお勧めします。

于 2012-11-17T18:02:23.753 に答える
13

オプションがあります-Python標準ライブラリまたはIPython。

Python標準ライブラリには、「インタラクティブなPythonインタプリタの動作を厳密にエミュレートする」ことを目的としcodeたクラスを持つモジュールがあります。InteractiveConsoleこれでおそらくあなたが望むことを行うことができるでしょうが、ドキュメントにはこれを使用する方法の例がなく、どこに行くべきかについての提案はありません。

より高度なPythonターミナルであるIPythonには、組み込みのプログラムの任意の時点でコンソールを埋め込むオプションがあります。彼らのドキュメントによると、簡単に行うことができます。

from IPython import embed

for thing in set_of_things:
  embed()
  do_stuff_to(thing)
于 2012-11-17T17:23:55.290 に答える
4

私にとって最も快適なツールはipdbです。

ipdbは、IPythonデバッガーにアクセスするための関数をエクスポートします。このデバッガーは、タブ補完、構文の強調表示、より優れたトレースバック、pdbモジュールと同じインターフェイスを備えたより優れたイントロスペクションを備えています。

完了と便利なイントロスペクションは、デバッグに特に役立ちます。

于 2012-11-17T19:20:45.493 に答える
4

を使用できますipdb

ブレークポイントを設定するには、デバッガーにジャンプする場所を追加import ipdb; ipdb.set_trace()します。ブレークポイントに到達すると、インタラクティブシェルと、コンテキスト用のブレークポイントの周囲に数行のコードが表示されます。

https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/

于 2016-04-07T12:40:09.967 に答える
3

Python 3.7以降では、次breakpoint()のようにデバッガーにアクセスするために使用することもできます。

for thing in set_of_things:
    breakpoint()
    do_stuff_to(thing)

これは覚えて書くのが少し簡単で、デフォルトでpdbでコードを開きます。

ただし、PYTHONBREAKPOINT環境を呼び出し可能オブジェクトの名前に設定することもできます。これは、またはなどの別のデバッガーpudbipdbまたはIPythonなどのその他のデバッガーである可能性がありembedます。

于 2020-05-08T18:40:50.907 に答える