5

pdbとを使用してインタープリターにドロップする方法を知っていますIPythonが、これには、どこで停止したいかを事前に正確に知る必要があります。ただし、数分から数時間かかる数値処理スクリプトを実行することがよくあり、その進行状況を正確に知りたいと思っています。解決策の 1 つは、単純に多くのログ ステートメントをいたるところに配置することですが、そうすると、あまりにも多くの情報が氾濫するか、知りたいことを正確にログに記録できなくなります。

キーの組み合わせによって、現在どこにいてもコードにドロップするリスナー ループを初期化する方法はありますか? CTRL+Z を考えてみてください。ただし、Bash ではなく Python のままにしておきます。

4

2 に答える 2

7

信号モジュールを使用して、control-C または control-Z などを押したときにデバッガーを起動するハンドラーをセットアップできます.. SIGINTR、SIGSUSP。

たとえば、instant_debug.pySIGQUIT をオーバーライドするモジュールを定義します。

import signal
import pdb

def handler(signum, frame):
  pdb.set_trace()

signal.signal(signal.SIGQUIT, handler)

次に、スクリプトを作成します

import instant_debug
import time

for i in xrange(1000000):
  print i
  time.sleep(0.1)

実行中の任意の時点で、 と入力してコードにジャンプし、通常のようにとCTRL+\でスタックを調べてから、何も起こらなかったかのように を続行できます。次の「アトミック」操作の最後にのみジャンプすることに注意してください。つまり、巨大な C モジュールの途中で停止することはありません。udpdbc

于 2012-04-21T02:30:02.610 に答える
1

あなたはこれを行うことができます

def main():
    i = 1000
    while True:
        print "Count Down %s" % i
        time.sleep(1)
        i -= 1

try:
    main()
except KeyboardInterrupt:
    pass # Swallow ctrl-c
finally:
    code.interact("Dropped into interpreter", local=globals())
于 2012-04-21T11:11:48.953 に答える