【问题标题】:Solving thread cleanup on paramiko解决 paramiko 上的线程清理问题
【发布时间】:2010-12-17 05:51:31
【问题描述】:

我有一个使用 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__ 析构函数中关闭了连接,然后在脚本结束前关闭它,但这些都不起作用。还有更多,使用这个之前发生的错误,所以可能与解释器关闭无关??

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    __del__ 不是解构器。当您删除对象的姓氏时调用它,当您退出解释器时不会发生这种情况。

    任何管理上下文的东西,例如连接,都是context manager 例如closing:

    with closing(make_connection()) as conn:
        dostuff()
    
    # conn.close() is called by the `with`
    

    无论如何,发生此异常是因为您有一个守护线程仍在尝试完成它的工作,而解释器已经关闭。

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

    【讨论】:

    • 在 python 2.5+ 上存在解构器???或者如何清洁线程,如何知道?对不起,但在这种情况下,我是新手
    • @Jochen 难道我们不希望在解释器关闭时所有的守护线程都能正常关闭吗?你能给出这个错误信息的确切原因吗?
    【解决方案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()
      

      我希望这对任何人都没有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2011-06-30
        • 2014-02-15
        • 1970-01-01
        • 2021-05-27
        相关资源
        最近更新 更多