Qt4.8 文档(如提到的 here )建议 QtCore.QFile 对象在销毁时关闭其文件(如果文件已打开)。
这是否意味着这个 PyQt4 代码片段
my_file = QtCore.QFile('some_file.bin')
my_file.open(QtCore.QFile.ReadOnly)
... do stuff that might raise an exception ...
与此非 PyQt 代码片段类似,它使用 open()
作为上下文管理器?
with open('some_file.bin', 'rb') as my_file:
... do stuff that might raise an exception ...
也就是说,当出现问题并且程序退出时,文件会自动关闭(如所讨论的,例如 here )。
最佳答案
没有。如果发生错误,QFile
不会自动关闭。事实上,也不会有异常(exception)。 Qt 根本不执行异常,因此您需要检查返回值并查询 error()
方法。
以下是一些示例输出:
>>> f = QtCore.QFile('/tmp/test.txt')
>>> f.open(QtCore.QIODevice.ReadWrite)
True
>>> f.resize(10)
True
请注意,Qt 在此仅返回 True/False
,而 Python 在出现问题时会引发 OSError/IOError
。
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True
这里需要进行显式检查,以确保读取时没有发生错误。
>>> f.close()
>>> f.open(QtCore.QIODevice.ReadOnly)
True
>>> f.resize(20)
False
>>> f.error() == QtCore.QFile.ResizeError
True
现在已经引发了一个错误 - 但没有引发异常,并且文件仍然打开且可读:
>>> f.isOpen()
True
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True
删除QFile
会自动关闭它;但否则,您将需要显式关闭它以释放资源 - 即使在其生命周期内发生错误。
关于qt - 在上下文管理方面,QFile.open() 的行为与 Python 的 open() 类似吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333784/