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. Peter -- http://mail.python.org/mailman/listinfo/python-list