multiprocessing.Process()
によって生成された子プロセスをデバッグする必要があります。 pdb
デグッガーはフォークを認識せず、すでに実行中のプロセスにアタッチできません。デバッガをPythonサブプロセスに接続するにはどうすればいいですか?
サブプロセスに接続できるスマートなpythonデバッガーはありますか?
multiprocessing.Process()
によって生成された子プロセスをデバッグする必要があります。 pdb
デグッガーはフォークを認識せず、すでに実行中のプロセスにアタッチできません。デバッガをPythonサブプロセスに接続するにはどうすればいいですか?
サブプロセスに接続できるスマートなpythonデバッガーはありますか?
Winpdbは、よりスマートなPythonデバッガの定義です。これは明示的にgoing down a forkをサポートしていますが、multiprocessing.Process()
でうまく動作するかどうかはわかりませんが、試してみる価値はあります。
ユースケースのサポートを確認する候補リストについては、wikiのPython Debuggersのリストを参照してください。私は、この問題の解決策にシンプルを探して、これを思い付いてきた
サポートされているプラットフォームの場合は、DTraceを試してください。ほとんどのBSD/Solaris/OS XファミリはDTraceをサポートしています。
Here is an intro by the author。 Dtraceを使って何かをデバッグすることができます。
Here is a SO post DTraceの学習。
この:
import sys
import pdb
class ForkedPdb(pdb.Pdb):
"""A Pdb subclass that may be used
from a forked multiprocessing child
"""
def interaction(self, *args, **kwargs):
_stdin = sys.stdin
try:
sys.stdin = open('/dev/stdin')
pdb.Pdb.interaction(self, *args, **kwargs)
finally:
sys.stdin = _stdin
はそれをあなたが古典的なPdbのを使用する場合がありますのと同じ方法を使用しますRomualdの答えの精緻化で、ファイル記述子を使って元のstdinを復元します。これにより、デバッガ内部でreadlineが動作し続けます。さらに、KeyboardInterruptのpdb特別管理は、マルチプロセッシングsigintハンドラを妨害しないように、無効になっています。
class ForkablePdb(pdb.Pdb):
_original_stdin_fd = sys.stdin.fileno()
_original_stdin = None
def __init__(self):
pdb.Pdb.__init__(self, nosigint=True)
def _cmdloop(self):
current_stdin = sys.stdin
try:
if not self._original_stdin:
self._original_stdin = os.fdopen(self._original_stdin_fd)
sys.stdin = self._original_stdin
self.cmdloop()
finally:
sys.stdin = current_stdin
素晴らしい! Winpdbはマルチプロセッシングでうまくいきます.Process() – grep
Winpdbはマルチプラットフォーム、フリー、フリーソフトウェアです。 – OliverUv
winpdbについて読んで20分以内に、既存のスクリプトでインタラクティブなデバッグセッションをインポートする方法を見つけられませんでした。 pdb.set_trace() 'しかし、ここでのForkedPdbの答えは魅力的でした! – Pat