Решающая нить зачистки по парамико - PullRequest
11 голосов
/ 17 ноября 2009

У меня автоматизированный процесс с использованием 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__, затем закрываю его до конца скрипта, ни один из которых не работает. Есть ли еще, при использовании этого ошибка произошла ранее, так что, возможно, это не связано с выключением интерпретатора ??

Ответы [ 3 ]

7 голосов
/ 17 ноября 2009

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

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

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

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

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

Я думаю, что вы можете исправить это, написав код, который останавливает все запущенные потоки перед выходом.

1 голос
/ 27 июля 2011

У меня сейчас дело не в этом. Но найти это обсуждение, поиск проблемы с моим приложением 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()

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

1 голос
/ 17 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...