2009-11-16 10 views
11

je un processus automatisé en utilisant paramiko et cette erreur:Solving nettoyage de fil sur paramiko

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

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

Je comprends c'est un problème dans le nettoyage/filetage, mais je ne sais pas comment le résoudre.

J'ai la dernière version (1.7.6) et selon this thread, il a été résolu, donc je télécharge le code directement mais toujours obtenir l'erreur.

L'erreur se produit sur Python 2.5/2.6 sous winxp/win2003.

Je ferme la connexion dans le destructeur __del__, puis fermez-le avant la fin du script, mais cela ne fonctionne pas. Y at-il plus, en utilisant cela l'erreur est survenue plus tôt, alors peut-être n'est pas liée à l'arrêt de l'interprète?

Répondre

7

__del__ n'est pas un déconstructeur. Il est appelé lorsque vous supprimez le nom de famille d'un objet, ce qui ne se produit pas lorsque vous quittez l'interpréteur.

Tout ce qui gère un contexte, comme les connexions, est un context manager Par exemple, il est closing:

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

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

Quoi qu'il en soit, cette exception se produit parce que vous avez un fil daemonic qui tente encore de le faire est tout de travail l'interprète est déjà en train de fermer.

Je pense que vous ne pouvez résoudre ce problème qu'en écrivant du code stops all running threads avant de quitter.

+0

Et existe un déconstructeur sur python 2.5 + ??? Ou comment nettoyer les discussions, comment savoir? Désolé, mais dans ce cas je suis un débutant – mamcx

+0

@Jochen Ne nous attendons-nous pas à ce que tous les fils de démon se ferment gracieusement quand l'interprète est en train de s'éteindre? Pouvez-vous donner la raison exacte de ce message d'erreur? – Buchi

1

Fermez vos connexions dans le flux de contrôle du programme normal, pas __del__, comme @ THC4k dit, ce n'est pas un déconstructeur, et en général, vous ne devrait pas besoin d'utiliser __del__ (bien sûr il y a des exceptions).

Si vous créez vos propres threads, vous devez .setDaemon (True) si vous voulez qu'ils se terminent normalement lorsque le thread principal se ferme.

1

Je maintenant, n'est pas le cas. Mais a trouver cette discussion, la recherche d'un problème avec mon application wxpython. Résolvez-le pour ajouter un événement de fermeture à la trame principale. Donc tout le fil sera proche.

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

J'espère que cela ne peut aider à tout le monde.