web-dev-qa-db-ja.com

pdb.set_trace()がフリーズしたノーズテストを引き起こし、デバッガーにドロップしません

Nosetestsを使用して一連のテスト(.pyファイル)を実行しています。クラシックを使用

import pdb; pdb.set_trace()

実行されるnosetestsは決して完了しません。ブレークポイントが設定された場所でハングしますが、pdbデバッガーにドロップすることはありません。

なぜこれになるのか考えはありますか?ブレークポイントをいくつかの異なる位置(他のテスト関数、他のファイル)に移動しようとしましたが、役に立ちませんでした。

54
Bodhi

-s/--nocaptureオプションを指定してnoseを実行すると、pdbプロンプトが表示され、デバッガーと正常に対話できるようになります。

コマンドラインを使用する場合、次のことを意味します。-

python manage.py  test -s [other-opts-and-args]
57
stderr

Noseは出力をキャプチャし、リダイレクトしています。したがって、ブレークポイントはヒットしますが、表示されません。デバッグ出力が画面に表示されるように、出力リダイレクトをオフにする必要があります。

あなたが使用する場合、鼻はあなたのためにこれを行うことができます:

from nose.tools import set_trace; set_trace()

の代わりに:

import pdb;pdb.set_trace()
33
Joe L.

私の場合、フラグフラグ-s/-nocaptureはまだ解決せず、コンパイラをpdbにドロップします。

調べることができるもう1つの理由は、テストの一部としてMySQLなどのデータベースを使用している場合、別の同時プロセスによってロックされていないことです。私の場合、SQL Alchemyを介してMySQLデータベースにクエリを実行するためにpython Shellを起動し、テーブルをロックしていました。その結果、私の鼻のテストがハングし、実行/終了しませんでした。

テーブルをロックしていたpythonプロセスを強制終了し、Noseはスニッフィングをバックアップしていました

> $ ps auxww | grep python | awk '{print $ 2}' | Sudo xargs kill -9