Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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??

like image 670
mamcx Avatar asked Nov 16 '09 22:11

mamcx


People also ask

Is Paramiko thread safe?

Paramiko is not thread safe.

What can you do with Paramiko?

Paramiko helps you automate repetitive system administration tasks on remote servers.

What is the meaning of Paramiko?

Paramiko is a Python library that makes a connection with a remote device through SSh. Paramiko is using SSH2 as a replacement of SSL to make a secure connection between two devices. It also supports the SFTP client and server model.


3 Answers

__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.

like image 128
Jochen Ritzel Avatar answered Nov 13 '22 07:11

Jochen Ritzel


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.

like image 20
JimB Avatar answered Nov 13 '22 06:11

JimB


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.

like image 26
peter Avatar answered Nov 13 '22 08:11

peter