Устранение очистки нитей на парамико
У меня есть автоматизированный процесс с использованием paramiko и эта ошибка:
Exception in thread Thread-1 (most likely raised during interpreter
shutdown)
....
....
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute
'error'
Я понимаю, что это проблема в очистке/потоке, но я не знаю, как это исправить.
У меня есть последняя версия (1.7.6) и в соответствии с этот поток, она была решена, поэтому я загружаю код напрямую, но все равно получите ошибку.
Сбой происходит на Python 2.5/2.6 под winxp/win2003.
Я закрываю соединение в деструкторе __del__
, а затем закрываю его до конца script, ни одна из которых не работает. Есть ли еще, используя эту ошибку раньше, поэтому, возможно, не связано с отключением интерпретатора??
Ответы
Ответ 1
__del__
не является деконструктором. Он вызывается, когда вы удаляете имя объекта, что не обязательно происходит при выходе из интерпретатора.
Все, что управляет контекстом, например соединениями, является context manager
Например, есть closing
:
with closing(make_connection()) as conn:
dostuff()
# conn.close() is called by the `with`
В любом случае это исключение происходит, потому что у вас есть демонический поток, который все еще пытается это сделать, пока интерпретатор уже отключается.
Я думаю, вы можете исправить это, написав код, который останавливает все запущенные потоки перед выходом.
Ответ 2
Закройте свои соединения в обычном потоке управления программой, а не в __del__
, так как @THC4k сказал, что это не деконструктор, и вообще вам не нужно использовать __del__
(конечно, есть исключения).
Если вы создаете свои собственные потоки, вам нужно .setDaemon(True), если вы хотите, чтобы они нормально выходили, когда основной поток завершается.
Ответ 3
Я сейчас, это не так. Но найдите эту дискуссию, ища проблему с моим приложением 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()
Я надеюсь, что эта помощь не поможет никому.