为什么NamedTemporaryFile()。write(没有中间变量)导致“关闭文件的I / O操作”?

时间:2013-08-28 22:45:09

标签: python destroy temporary-files

我有以下脚本,两次做同样的事情,方式略有不同。第一部作品,第二部作品不是:

#!/usr/bin/python
import tempfile

fhandle=tempfile.NamedTemporaryFile(dir=".",delete=False)
fhandle.write("hello")

tempfile.NamedTemporaryFile(dir=".",delete=False).write("hello")

我收到以下错误:

Traceback (most recent call last):
  File "./test.py", line 7, in <module>
     tempfile.NamedTemporaryFile().write("hello")
 ValueError: I/O operation on closed file

在我的示例脚本中,我将它们放在一起以显示第一个有效。这不会影响结果,只是指出存在差异。

这是Python中的错误吗?我的机器有点奇怪吗?预期的行为?正确的行为?看起来这个对象在write()之前被销毁了。

Ubuntu 12.04.3 LTS上的Python 2.7.3

2 个答案:

答案 0 :(得分:1)

正确答案(来自这个问题的答案和进一步测试):这是一个错误。

我提出了一个错误,可以在这里看到:http://bugs.python.org/issue18879

答案 1 :(得分:0)

我认为来自@Eric Urban和@alecxe的评论是正确的,文件是关闭的 - 取决于平台 - 基于引用计数或类似的东西。我尝试使用类似的过程查看新创建的tempfile对象:

>>> tempfile.NamedTemporaryFile().__dict__
{'close_called': True, 'name': '/tmp/tmpCRzR_c', 'file': <closed file '<fdopen>', mode 'w+b' at 0x7f9448e541e0>, 'delete': True}

>>> a = tempfile.NamedTemporaryFile()
>>> a.__dict__
{'close_called': False, 'name': '/tmp/tmpnmWpQ5', 'file': <open file '<fdopen>', mode 'w+b' at 0x7f9448e54270>, 'delete': True}

创建后的某个时间,在新创建的临时文件中调用close,可能是因为没有引用它。根据您的平台和调用方式,关闭文件也可能会将其删除。