[解決済み] 関数が呼び出されたときに印刷するにはどうしたらいいですか?
質問
Python スクリプトをデバッグする際に、プログラム全体のコールスタックを知りたいと思います。 理想的な状況は、Python が呼び出されたときにすべての関数名を表示する Python のコマンドラインフラグがあった場合です (私はチェックした
man Python2.7
をチェックしましたが、この種のものは見つかりませんでした)。
このスクリプトでは関数の数が多いので、できれば各関数および/またはクラスの先頭にprintステートメントを追加しない方がいいと思います。
中間的な解決策は、PyDevのデバッガを使用して、いくつかのブレークポイントを置き、私のプログラム内の指定されたポイントのコールスタックをチェックすることでしょう。
もしそのような方法があるならば、私はまだ、プログラムの生涯を通じて呼び出されたすべての関数の完全なリストを見ることを好みます。
どのように解決するのですか?
トレース関数でこれを行うことができます(リターンをトレースし、いくつかの素晴らしいインデントを使用するために、このオリジナルのバージョンを改善したSpacedmanに感謝します)。
def tracefunc(frame, event, arg, indent=[0]):
if event == "call":
indent[0] += 2
print("-" * indent[0] + "> call function", frame.f_code.co_name)
elif event == "return":
print("<" + "-" * indent[0], "exit function", frame.f_code.co_name)
indent[0] -= 2
return tracefunc
import sys
sys.setprofile(tracefunc)
main() # or whatever kicks off your script
関数のコードオブジェクトは通常関連する関数と同じ名前を持ちますが、関数は動的に生成されることがあるので、常にそうとは限らないことに注意してください。残念ながら、Pythonはスタック上の関数オブジェクトを追跡しません(私は時々、このためのパッチを提出することを空想していました)。それでも、ほとんどの場合、これは確かに "十分" なのです。
もしこれが問題になるなら、ソース コードから本当の関数名を抽出するか (Python はファイル名と行番号を追跡します)、どの関数オブジェクトがコード オブジェクトを参照しているかをガベージコレクタに確認させることができます。コードオブジェクトを共有する複数の関数が存在する可能性がありますが、それらの名前のどれでも十分によいかもしれません。
4 年後にこれを再検討するために戻ってきたとき、Python 2.6 以降で
sys.setprofile()
よりも
sys.settrace()
. 同じトレース関数が使えます。ただ、プロファイル関数は関数が入力または終了したときだけ呼び出されるので、関数の中のものは全速力で実行されます。
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] 改行やスペースを入れずに印刷する方法
-
[解決済み] print()を使用してクラスのインスタンスを表示するには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] pycharmがタブをスペースに自動変換する
最新
-
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のコードでメソッドから現在のコールスタックを表示する
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複