Устранение очистки нитей на парамико

У меня есть автоматизированный процесс с использованием 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()

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