3

pynetdicom ライブラリを利用するアプリケーションをデバッグしようとしています。その特定の詳細がどの程度関連しているかはわかりませんが、関連するのは、マルチスレッドを多用して、メインスレッドをブロックせずにバックグラウンドソケットリスナータスクを実行することです。これを再現するには、storescp.py の例を使用できます。

発生するブレークポイントを配置するたびに (メインまたは子のどのスレッドで発生するかに関係なく)、次のトレースバックが表示されます。

Traceback (most recent call last):
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 1397, in <module>
    debugger.run(setup['file'], None, None)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 1090, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "/Users/alexw/Development/Python/kreport2/KReport2/dicomdatascraper.py", line 183, in <module>
    oldDicomList = copy.copy(newData)
  File "/Users/alexw/Development/Python/kreport2/KReport2/dicomdatascraper.py", line 183, in <module>
    oldDicomList = copy.copy(newData)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_frame.py", line 135, in trace_dispatch
    self.doWaitSuspend(thread, frame, event, arg)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_frame.py", line 25, in doWaitSuspend
    self._args[0].doWaitSuspend(*args, **kwargs)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 832, in doWaitSuspend
    self.processInternalCommands()
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 360, in processInternalCommands
    thread_id = GetThreadId(t)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_constants.py", line 140, in GetThreadId
    return thread.__pydevd_id__
  File "/Users/alexw/.virtualenvs/kreport2dev/devlibs/pynetdicom/source/netdicom/applicationentity.py", line 73, in __getattr__
    obj = eval(attr)()
  File "<string>", line 1, in <module>
NameError: name '__pydevd_id__' is not defined

私の考えでは、おそらく、物事を機能させるために、PyDev__pydevd_id__は生成されたスレッドにモンキー パッチを適用しますが、これらのスレッドは実際にはサブクラスであり、threading.Thread(この場合、 worker は ) のインスタンスですclass Association(threading.Thread):

もちろん、私はこの理論を確認したり修正したりできるほど PyDev についてよく知りません。そして、インターネットもそうではないようです。

サブクラス化はThreadめったに使用されないパターンなので、PyDev アーキテクチャでは考慮されていませんか? ライブラリを再構築せずに、この問題をどのように解決できますか?

4

1 に答える 1