2016-01-11 38 views
5

Oto mój przykładowy kod:nie można usunąć plik, który utworzony przez `tempfile.mkstemp()` na Windows

import os 
from tempfile import mkstemp 

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

Gdy uruchomię go na moim Linuksie, to działa dobrze. Ale gdy uruchomię go na moim Windows XP przy użyciu Python 3.4.4, to podniósł się następujący błąd:

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' 

Jednak kiedy używam tempfile.NamedTemporaryFile() utworzyć plik temp i zamknąć go, to automatycznie usuwane.

Dlaczego system Windows nie może usunąć plików utworzonych przez mkstemp? Gdzie robię źle?

+0

Próbowałaś zamykając go w pierwszej kolejności? –

+0

@ IgnacioVazquez-Abrams: Huh? Gdzie go otworzyłem? Czy nie jest "mkstemp()" wystarczy utworzyć plik? W moim kodzie nie ma 'open()', a 'fname' jest obiektem typu string. –

+2

Należy zauważyć, że mkstemp() zwraca ** krotkę ** z uchwytem otwartego pliku. Dopóki nie zamkniesz tego uchwytu plik jest w użyciu (... przez inny proces: twój własny). Działa w systemie Windows z powodu działania os.remove() W systemie Windows próba usunięcia pliku, który jest w użyciu, powoduje zgłoszenie wyjątku, w systemie Unix pozycja katalogu jest usuwana, ale pamięć przydzielona do pliku nie jest dostępna. udostępniane do czasu, gdy oryginalny plik nie będzie już używany). –

Odpowiedz

10

Od 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)