2009-11-16 9 views
11

tengo un proceso automatizado usando paramiko y tienen este error:Solución de hilo de limpieza en paramiko

Exception in thread Thread-1 (most likely raised during interpreter 
shutdown) 

.... 
.... 
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 
'error' 

entiendo que es un problema en la limpieza/roscado, pero no sé cómo solucionarlo.

Tengo la última versión (1.7.6) y de acuerdo con this thread, se solucionó, así que descargué el código directamente pero aún recibo el error.

El error se produce en Python 2.5/2.6 bajo WinXP/Win2003.

Cierro la conexión en el destructor __del__, luego lo cierro antes del final del script, ninguno de los cuales funciona. ¿Hay más, usando esto el error ocurrió antes, entonces tal vez no está relacionado con el cierre del intérprete?

Respuesta

7

__del__ no es un Deconstructor. Se llama cuando elimina el apellido de un objeto, lo que no ocurre necesariamente cuando sale del intérprete.

Cualquier cosa que gestiona un contexto, como las conexiones, es un context manager Por ejemplo, hay closing:

with closing(make_connection()) as conn: 
    dostuff() 

# conn.close() is called by the `with` 

De todas formas, esta excepción se debe a que usted tiene un hilo daemonic que todavía está tratando de hacer es el trabajo mientras el intérprete ya está cerrando.

creo que sólo se puede solucionar este problema mediante la escritura de código que stops all running threads antes de salir.

+0

¿Y existe un deconstructor en python 2.5 + ??? O cómo limpiar los hilos, ¿cómo sabes? Lo sentimos, pero en este caso soy novato – mamcx

+0

@Jochen ¿No esperamos que todos los subprocesos del daemon se cierren elegantemente cuando el intérprete se cierre? ¿Puedes dar la razón exacta de este mensaje de error? – Buchi

1

cierre de las conexiones en el flujo de control del programa normal, no en __del__, como @ THC4k dicho, no es un Deconstructor, y, en general, que no debería necesitar usar __del__ (por supuesto hay excepciones).

Si va a crear sus propios hilos, tiene que .setDaemon (verdadero) si usted quiere que salen normalmente cuando las principales salidas de rosca.

1

ahora, no es el caso. Pero encuentre esta discusión, buscando un problema con mi aplicación wxpython.

resolverlo añadir un evento cerca de la estructura principal. Entonces todo el hilo estará cerca.

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() 

espero que esto no puede ayudar a nadie.