我有以下脚本,两次做同样的事情,方式略有不同。第一部作品,第二部作品不是:
#!/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
答案 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
,可能是因为没有引用它。根据您的平台和调用方式,关闭文件也可能会将其删除。