2009-11-16 5 views
11

У меня есть автоматизированный процесс с помощью paramiko и эта ошибка:Решая нить очистки на paramiko

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

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

Я понимаю, что это проблема в очистке/резьбе, но я не знаю, как это исправить.

У меня есть последняя версия (1.7.6) и в соответствии с this thread, она была решена, поэтому я загружаю код напрямую, но все равно получаю сообщение об ошибке.

Ошибка происходит на Python 2.5/2.6 под winxp/win2003.

Я закрываю соединение в деструкторе __del__, а затем закрываю его до конца скрипта, ни одно из которого не работает. Есть ли еще, используя эту ошибку раньше, поэтому, возможно, не связано с отключением интерпретатора ??

ответ

7

__del__ не является деконструктором. Он вызывается, когда вы удаляете фамилию объекта, что не обязательно происходит при выходе из интерпретатора.

Все, что управляет контекстом, например, соединения, является context manager Например, есть closing:

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

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

В любом случае, происходит это исключение, потому что у вас есть демоническое нить, которая по-прежнему пытается сделать свою работу в то время как интерпретатор уже отключается.

Я думаю, вы можете исправить это, написав код, который stops all running threads перед выходом.

+0

И существует деконструктор на python 2.5 + ??? Или как чистые потоки, как вы знаете? Извините, но в этом случае я новичок – mamcx

+0

@Jochen Не ожидаем, что все потоки демона будут закрыты грациозно, когда интерпретатор отключится? Можете ли вы дать точную причину этого сообщения об ошибке? – Buchi

1

Закройте соединения в нормальном потоке управления программой, а не в __del__, а @ THC4k сказал, что это не Разрушитель, и вообще, вы не необходимости использовать __del__ (конечно, есть исключения).

Если вы создаете свои собственные потоки, вам нужно установить .setDaemon (True), если вы хотите, чтобы они нормально выходили, когда основной поток завершается.

1

Я сейчас, это не так. Но найдите эту дискуссию, ища проблему с моим приложением wxpython.

Решите, чтобы добавить событие закрытия к основному кадру. Таким образом, весь поток будет близок.

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

Я надеюсь, что эта помощь не поможет никому.

 Смежные вопросы

  • Нет связанных вопросов^_^