tempfile.NamedTemporaryFile wont work

Imbaud Pierre pierre at saiph.com
Sun Nov 19 13:14:54 EST 2006


Peter Otten a écrit :
> Steven D'Aprano wrote:
> 
> 
>>On Sun, 19 Nov 2006 13:11:13 +0100, Imbaud Pierre wrote:
>>
>>
>>>On suse 9.3, tempfile.NamedTemporaryFile() doesnt work as expected.
>>
>>[snip]
>>
>>
>>>Symptom: the file does not always exist, after the call to
>>>NamedTemporaryFile(). Or at least its not seen by the strings command,
>>>or by os.path.exists.
>>>
>>>I guess the bug is pretty much os dependent, or even filesystem
>>>dependent (Im on reiserfs). Maybe the os is buggy, maybe, somehow, the
>>>python interface. Or did I miss something?
>>>Shame, I didnt even try to check for a python bug tracker.
>>
>>I can verify this problem occurs on Fedora Core 5 too:
>>
>>import os
>>import sys
>>import tempfile
>>import subprocess
>>def test(n):
>>chunk = ': +++ abcd +++'
>>for i in xrange(n):
>>tf = tempfile.NamedTemporaryFile()
>>tfName = tf.name
>>tf.seek(0)
>>tf.write(str(i) + chunk)
>>                tf.flush()
>>if not os.path.exists(tfName):
>>print 'pre-check: %s not there' % tfName
>>subprocess.Popen(['strings', tfName])
>>if not os.path.exists(tfName):
>>print 'post-check: %s not there' % tfName
>>
>>
>>And here is a typical run, with the boring bits removed for ease of
>>reading:
>>
>>
>>>>>test(30)
>>
>>0: +++ abcd +++
>>1: +++ abcd +++
>>    [ more of the same ]
>>14: +++ abcd +++
>>strings: '/tmp/tmpOALbx9': No such file
>>16: +++ abcd +++
>>17: +++ abcd +++
>>18: +++ abcd +++
>>    [ more of the same ]
>>27: +++ abcd +++
>>strings: /tmp/tmpdc52Nz: No such file or directory
>>29: +++ abcd +++
>>
>>
>>Curiouser and curiouser... not only does os.path.exist always report the
>>temp file as existing (at least in my tests), even when strings can't find
>>it, but strings returns different error messages.
>>
>>Is it possible this is a bug in strings?
> 
> 
> What /you/ are seeing is not a bug, I think. Popen() is asynchronous,
> therefore you may enter the second iteration -- which implicitly closes the
> temporary file -- before strings actually tries to access it. Use call()
> and everything should be fine.
Thanks A LOT, works fine, I feel kind of silly; your diagnostic is
pretty obvious, afterward... I felt uneasy not closing the Popen, but
it worked, so why bother? Its so easy to make ugly code!




More information about the Python-list mailing list