pdbでPythonをデバッグするとき、各変数を指定せずにすべての変数の値を表示するにはどうしたらいいですか?
質問
Pythonスクリプトのデバッグに pdb を使っていますが、マニュアルによると p 変数 コマンドを使えば、ある時点の指定された変数の値を表示することができると書いてあります。しかし、もし私がたくさんの変数、例えば20個の変数を持っていて、それらすべての値を追跡したい場合はどうしたらよいでしょうか?それぞれの変数を手動で指定することなく、すべての変数を表示するにはどうしたらよいでしょうか?たとえば、こんなスクリプトがあります。
a = 1
b = 2
c = 3
pdbでデバッグして、全部を表示するには p a, b, c のようにします。
$ python -m pdb test.py
> /media/test.py(1)<module>()
-> a = 1
(Pdb) n
> /media/test.py(2)<module>()
-> b = 2
(Pdb) n
> /media/test.py(3)<module>()
(Pdb) n
--Return--
> /media/test.py(3)<module>()->None
-> c = 3
(Pdb) p a, b, c
(1, 2, 3)
(Pdb)
しかし、私は手動で各変数を指定する必要があります。一つ一つの変数を指定せずに、全ての変数を一度に表示する方法はありませんか?
どのように解決するのですか?
pdbは完全な機能を持ったPythonシェルなので、任意のコマンドを実行することができます。
locals()
と
globals()
は、スコープ内のすべての変数をその値とともに表示します。
を使うことができます。
dir()
を使うことができます。
Pythonで変数を宣言すると、適宜ローカルやグローバルに入れられるので、自分で定義した変数と他の理由で自分のスコープに入ったものを区別する方法はありません。
dir()を使う場合、興味のある変数はそのリストの先頭か末尾にあることが多いでしょう。 もしあなたがキーと値のペアを取得したいのであれば
locals() のフィルタリング は以下のような感じになるかもしれません。
>>> x = 10
>>> y = 20
>>> {k: v for k,v in locals().iteritems() if '__' not in k and 'pdb' not in k}
{'y': 20, 'x': 10}
locals()が本当に混乱している場合、もう少し手強いものが必要でしょう。次の関数をpythonpath上のモジュールに置き、デバッグセッション中にそれをインポートすることができます。
def debug_nice(locals_dict, keys=[]):
globals()['types'] = `__import__`('types')
exclude_keys = ['copyright', 'credits', 'False',
'True', 'None', 'Ellipsis', 'quit']
exclude_valuetypes = [types.BuiltinFunctionType,
types.BuiltinMethodType,
types.ModuleType,
types.TypeType,
types.FunctionType]
return {k: v for k,v in locals_dict.iteritems() if not
(k in keys or
k in exclude_keys or
type(v) in exclude_valuetypes) and
k[0] != '_'}
にセッションの例を追加しました。 ペーストビン
これでは見逃すケースがいくつかあります。また、型を渡すことができるように拡張したいかもしれません。 しかし、定義した変数以外のほとんどのものをフィルタリングできるようにする必要があります。
dir()
もし最後の20個の値だけが欲しいのであれば、次のような出力が得られます。
>>> p var1 var2 ... varn
のような出力が得られるのであれば、dir()[-20:]のようにスライスしたほうがよいでしょう。
では変数と値の関係を簡単に見ることはできません。
例: "Did I declare foo before or after bar?"
もし、その関係を見たいのであれば、以下のような方法を試してみてください。これは、変数がdir()の最後にあると仮定しています。 変数が先頭にある場合は、別の方法でスライスすることができます。変数が連続していない場合、これはうまく動作しないでしょう。
>>> zip(dir(), [eval(var) for var in dir()])[-4:]
[('a', 10), ('var', 'var'), ('x', 30), ('y', 50)]
関連
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] モジュール名を文字列で指定してインポートするには?
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] 現在のPythonセッションのすべての変数を保存する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] 好きな言語を選んでください] のプログラム中のすべての変数を列挙してください [終了]。