11

我有一个使用 paramiko 的自动化过程并出现此错误:

Exception in thread Thread-1 (most likely raised during interpreter 
shutdown)

....
....
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 
'error' 

我知道这是清理/线程中的一个问题,但我不知道如何解决它。

我有最新版本(1.7.6),根据这个线程,它已经解决了,所以我直接下载了代码,但仍然得到错误。

失败发生在winxp/win2003下的Python 2.5/2.6。

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

4

3 回答 3

7

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

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

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

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

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

我认为您只能通过编写在退出之前停止所有正在运行的线程的代码来解决此问题。

于 2009-11-16T22:45:44.713 回答
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()

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

于 2011-07-27T12:28:56.590 回答
1

在正常的程序控制流中关闭你的连接,而不是 in __del__,正如@THC4k 所说,它不是解构器,一般来说,你不需要使用__del__(当然也有例外)。

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

于 2009-11-17T16:41:35.393 回答