解决paramiko上的线程清理问题

时间:2009-11-16 22:21:36

标签: python ssh 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,它已经解决了,所以我直接下载了代码,但仍然收到错误。

在winxp / win2003下的Python 2.5 / 2.6上发生了故障。

我在__del__析构函数中关闭连接,然后在脚本结束之前关闭它,这些都不起作用。还有更多,使用这个错误发生在前面,所以可能与解释器关闭无关吗?

3 个答案:

答案 0 :(得分:7)

__del__不是解构函数。当你删除一个对象的姓氏时会调用它,当你退出解释器时它不会发生。

管理上下文的任何内容(例如连接)都是context manager例如,有closing

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

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

无论如何,发生这种异常是因为你有一个守护程序线程在解释器已经关闭时仍在尝试执行它。

我认为你只能通过在退出之前编写stops all running threads代码来解决这个问题。

答案 1 :(得分:1)

关闭正常程序控制流程中的连接,而不是__del__,因为@ THC4k说,它不是解构函数,一般来说,你不应该需要使用{ {1}}(当然也有例外)。

如果您正在创建自己的线程,则需要.setDaemon(True),如果您希望它们在主线程退出时正常退出。

答案 2 :(得分: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()

我希望这对任何人都无法帮助。