2016-01-11 28 views
5

Ecco il mio codice di esempio:non può rimuovere un file che ha creato da `tempfile.mkstemp()` su Windows

import os 
from tempfile import mkstemp 

fname = mkstemp(suffix='.txt', text=True)[1] 
os.remove(fname) 

Quando eseguo sul mio Linux, funziona benissimo. Ma quando l'eseguo sul mio Windows XP utilizzando Python 3.4.4, ha sollevato il seguente errore:

Traceback (most recent call last): 
    File "C:\1.py", line 5, in <module> 
    os.remove(fname) 
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\DOCUME~1\\IEUser\\LOCALS~1\\Temp\\tmp3qv6ppcf.txt' 

Tuttavia, quando uso tempfile.NamedTemporaryFile() per creare un file temporaneo e chiuderlo, rimosso automaticamente.

Perché Windows non può rimuovere i file creati da mkstemp? Dove sto sbagliando?

+0

Hai provato chiudendola prima? –

+0

@ IgnacioVazquez-Abrams: Eh? Dove l'ho aperto? Non è 'mkstemp()' basta creare il file? Non c'è 'open()' nel mio codice e 'fname' è un oggetto stringa. –

+2

Si noti che mkstemp() restituisce una ** tupla ** con un handle di file aperto. Fino a quando non chiudi quella maniglia il file è in uso (... con un altro processo: il tuo). Funziona su Windows a causa di come funziona os.remove() (Su Windows, il tentativo di rimuovere un file che è in uso causa un'eccezione da sollevare, su Unix, la voce della directory viene rimossa ma la memoria allocata al file non è reso disponibile fino a quando il file originale non è più in uso_). –

risposta

10

Da the documentation:

Creates a temporary file in the most secure manner possible. [...]

[...]

mkstemp() returns a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.

fd, fname = mkstemp(suffix='.txt', text=True) 
os.close(fd) 
os.remove(fname)