9

単純な python アプリケーションをデバッグしようとしていますが、今のところうまくいきません。

import multiprocessing

def worker(num):
    for a in range(0, 10):
        print a

if __name__ == '__main__':
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        p.start()

forループ内にブレークポイントを設定して「a」の値を追跡したいのですが、試したツールではそれができません。これまでのところ、次の方法でデバッグを試みました。

  • PyCharm を実行すると、次のエラーが表示されます: ImportError: No module named pydevd - http://youtrack.jetbrains.com/issue/PY-6649彼らはまだこの問題の修正に取り組んでいるようです。これ
  • また、Winpdb - http://winpdb.orgでデバッグを試みましたが、単に「worker」メソッド内に入らず、「a」の値を出力するだけです。

これについて何か助けていただければ幸いです。

4

6 に答える 6

2

Pythonコードをデバッグしようとするときに、従来のデバッガーを使用する必要はめったにありません。代わりに、トレースステートメントをコードに自由に振りかけることを好みます。コードを次のように変更します。

import multiprocessing
import logging

def worker(num):
    for a in range(0, 10):
        logging.debug("(%d, %d)" % (num, a))

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        logging.info("Starting process %d" % i)
        p.start()

本番環境では、トレースレベルをlogging.WARNINGに設定してデバッグトレースステートメントを無効にし、警告とエラーのみをログに記録します。

Pythonの公式サイトには、基本的高度なロギングチュートリアルがあります。

于 2012-06-19T17:24:07.873 に答える
2

通常の pdb/ipdb がマルチプロセッシングで動作するなら素晴らしいことです。うまくいけば、構成されたプロセスの数が 1 の場合、マルチプロセッシングへの呼び出しをシリアルに処理します。

if processes == 1:
    for record in data:
        worker_function(data)
else:
    pool.map(worker_function, data)

次に、デバッグ時に、単一のプロセスのみを使用するようにアプリケーションを構成します。これは、特に同時実行の問題に対処する場合など、すべてのケースをカバーしているわけではありませんが、役立つ場合があります。

于 2015-11-16T20:11:16.733 に答える
2

すべてをvirtualenvにコピーした/Applications/PyCharm\ 2.6\ EAP.app/helpers/pydev/*.pyところsite-packages、うまくいきました(セロリ/昆布をデバッグしています。ブレークポイントは期待どおりに機能します)。

于 2013-01-12T15:03:15.150 に答える