我正在尝试调试一个使用pynetdicom库的应用程序。我不确定这个具体细节有多相关,但相关的是它大量使用多线程来运行后台套接字侦听器任务,而不阻塞主线程。可以使用storescp.py示例来再现此示例。
每当我放置遇到的断点(不管哪个线程、main或子线程在其中遇到),我都会得到以下跟踪:
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的子类,而不是直接的threading.Thread实例(在本例中,工作人员是class Association(threading.Thread):的一个实例)。
当然,我对PyDev的了解还不足以证实这一理论,否则我就会修正它。互联网似乎也是如此。
子类Thread是否很少使用,以致于在PyDev体系结构中根本没有考虑到它?如果不重新设计库,如何解决这个问题?
发布于 2013-04-04 07:54:43
我只需要更努力地寻找回溯。
在对threading.Thread的子类中,pynetdicom库覆盖了__getattr__,并对其进行了一些破坏。问题是:
def __getattr__(self, attr):
#while not self.AssociationEstablished:
# time.sleep(0.001)
obj = eval(attr)
# do some stuff
return obj当传递不存在的属性时,将引发NameError。这不是被pydev的猴击程序(if thread.__pydevd_id__ raises AttributeError, thread.__pydevd_id__ = stuff)捕获的。
解决办法是更新这一节:
def __getattr__(self, attr):
#while not self.AssociationEstablished:
# time.sleep(0.001)
try:
obj = eval(attr)
except NameError:
raise AttributeError
# do some stuff
return obj这将拦截NameError并引发一个AttributeError,如果查询的属性不存在,__getattr__就应该这样做。
https://stackoverflow.com/questions/15804780
复制相似问题