Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't access temporary files created with tempfile

Tags:

python

windows

I am using tempfile.NamedTemporaryFile() to store some text until the program ends. On Unix is working without any issues but on Windows the file returned isn't accessible for reading or writing: python gives Errno 13. The only way is to set delete=False and manually delete the file with os.remove(). Why?

like image 451
Rnhmjoj Avatar asked Mar 23 '13 15:03

Rnhmjoj


2 Answers

Take a look: http://docs.python.org/2/library/tempfile.html

 tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

This function operates exactly as TemporaryFile() does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the name attribute of the file object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If delete is true (the default), the file is deleted as soon as it is closed.

like image 43
Leo Chapiro Avatar answered Nov 16 '22 11:11

Leo Chapiro


This causes the IOError because the file can be opened only once after it is created.

The reason is because NamedTemporaryFile creates the file with FILE_SHARE_DELETE flag on Windows. On Windows when a file has been created/opened with specific share flag all subsequent open operations have to pass this share flag. It's not the case with Python's open function which does not pass FILE_SHARE_DELETE flag. See my answer on How to create a temporary file that can be read by a subprocess? question for more details and a workaround.

like image 116
Piotr Dobrogost Avatar answered Nov 16 '22 11:11

Piotr Dobrogost