Solving thread cleanup on paramiko
I have an automated process using paramiko and have this error:
Exception in thread Thread-1 (most likely raised during interpreter
shutdown)
....
....
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute
'error'
I understand that is a problem in the cleanup/threading, but I don开发者_运维知识库't know how to fix it.
I have the latest version (1.7.6) and according to this thread, it was solved, so I download the code directly but still get the error.
The failure occurs on Python 2.5/2.6 under winxp/win2003.
I close the connection in the __del__
destructor, then close it before the end of the script, none of which works. Is there more, using this the error happened earlier, so maybe is not related to interpreter shutdown??
__del__
is not a deconstructor. It's called when you delete a object's last name, which doesn't nessesarily happen when you exit the interpreter.
Anything that manages a context, such as connections, is a context manager
For example there is closing
:
with closing(make_connection()) as conn:
dostuff()
# conn.close() is called by the `with`
Anyways, this exception happens because you have a daemonic thread that is still trying to do it's work while the interpreter is already shutting down.
I think you can only fix this by writing code that stops all running threads before exiting.
Close your connections in the normal program control flow, not in __del__
, as @THC4k said, it's not a deconstructor, and in general, you shouldn't need to use __del__
(of course there are exceptions).
If you're creating your own threads, you need to .setDaemon(True) if you want them to exit normally when the main thread exits.
I now, is not the case. But a find this discussion, searching a problem whit my wxpython app.
Solve it to add a close event to the main frame. So all the thread's will be close.
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
super(MyFrame, self).__init__(*args, **kwargs)
# Attributes
self.panel = MainPanel(self)
# Setup
path = os.path.abspath("./comix.png")
icon = wx.Icon(path, wx.BITMAP_TYPE_PNG)
self.SetIcon(icon)
# Layout
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel, 1, wx.EXPAND)
self.SetSizer(sizer)
self.CreateStatusBar()
# Event Handlers
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnClose(self, event):
ssh.close()
winssh.close()
event.Skip()
I hope this cant help to anyone.
精彩评论