web-dev-qa-db-ja.com

python:大規模プロジェクトで関数の実行順序を追跡する方法

スクレイピーフレームワークで関数/クラスの実行順序を追跡したい。デフォルトのプロジェクト全体に複数の* .pyファイルがあり、どのpyファイルとクラスが順番に実行されたかを知りたい。ロガーラインをすべてのクラスと機能に配置するのは愚かなことです。この注文を視覚化する方法は?

cprofileは主に合計時間を測定するために使用されます。よくある質問ですが、1つのモジュール内の実行順序を視覚化することもできますが、複数のモジュールを視覚化することは困難です。

トレースパッケージに関しては、スクレイピーやDjangoのような大規模なプロジェクトで動作する適切な例が見つかりませんでした。トレース使用法のチュートリアルは、単一のpythonファイルについてです。

大規模なプロジェクトの複数のモジュール(たとえば、scrapy)の複数の* .pyファイルを1つのモジュールではなくトレースしたい。

私はpdbのようなデバッグツールを知っていますが、プロジェクト全体にブレークポイントを設定するのは面倒です。さらに重要なことに、実行順序を要約することは容易ではありません。

最後にハンターを使用して解決しました。これは、組み込みのトレースモジュールよりも優れています。トレースモジュールはinclude_dir属性を提供しませんでした。

スクレイピーのすべての行をトレースする方法に興味がある人のために。

$PYTHONHUNTER='Q(module_startswith=["scrapy", "your_project"])' scrapy list 


Djangoに関して、rest_frameworkの実行コードをトレースし、test.logに保存します。次に例を示します。

$PYTHONHUNTER='Q(module_startswith=["rest_framework", "your_project"]), action=CallPrinter(stream=open("test.log", "w"))' python manage.py runserver --noreload --nothreading
9
anonymous

痕跡

trace モジュールを使用すると、プログラムの実行を追跡し、注釈付きステートメントカバレッジリストを生成し、呼び出し元/呼び出し先の関係を印刷し、プログラムの実行中に実行される関数をリストできます。別のプログラムまたはコマンドラインから使用できます。

python -m trace --count -C . somefile.py ...

上記はsomefile.pyを実行し、実行中に現在のディレクトリにインポートされたすべてのPythonモジュールの注釈付きリストを生成します。

PDB

モジュール pdb は、Pythonプログラムのインタラクティブなソースコードデバッガーを定義します。これは、(条件付き)ブレークポイントの設定とソース行レベルでのシングルステップ、スタックフレームの検査、ソースコードリスト、および任意のスタックフレームのコンテキストでの任意のPythonコードの評価。また、事後分析デバッグをサポートし、プログラムの制御下で呼び出すことができます。

最も一般的に使用されるコマンド:

w(ここ)

  • 最新のフレームを下にして、スタックトレースを印刷します。矢印は現在のフレームを示し、ほとんどのコマンドのコンテキストを決定します。

d(own)

  • 現在のフレームをスタックトレースで1レベル下に移動します(新しいフレームに移動します)。

u(p)

  • 現在のフレームをスタックトレースで1レベル上に移動します(古いフレームに)。

この質問をチェックすることもできます Pythonデバッグのヒント

カバレッジ

Coverage.py は、通常テスト実行中にコードカバレッジを測定します。コード分​​析ツールとPython標準ライブラリで提供されるトレースフックを使用して、実行可能な行と実行された行を判別します。

猟師

Hunter は、カバレッジの測定ではなく、デバッグ、ロギング、検査、その他の悪意のある目的のための柔軟なコードトレースツールキットです。

デフォルトのアクションは、実行されているコードを出力することです。例:

import hunter
hunter.trace(module='posixpath')

import os
os.path.join('a', 'b')

端末での結果: Hunter Result in terminal

8
H.Tibat