2016-01-11 2 views
5

Voici mon exemple de code:Impossible de supprimer un fichier créé par `tempfile.mkstemp()` sur Windows

import os 
from tempfile import mkstemp 

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

Quand je lance sur mon Linux, il fonctionne très bien. Mais quand je le lance sur mon Windows XP en utilisant Python 3.4.4, il a soulevé l'erreur suivante:

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' 

Cependant, lorsque j'utilise tempfile.NamedTemporaryFile() pour créer un fichier temporaire et fermez-le, il automatiquement supprimé. Pourquoi Windows ne peut pas supprimer les fichiers créés par mkstemp?

Pourquoi Windows ne peut pas supprimer les fichiers créés par mkstemp? Où est-ce que je fais mal?

+0

Avez-vous essayé de le fermer en premier? –

+0

@ IgnacioVazquez-Abrams: Hein? Où l'ai-je ouvert? Est-ce que 'mkstemp()' ne crée pas le fichier? Il n'y a pas de 'open()' dans mon code et 'fname' est un objet chaîne. –

+2

Notez que mkstemp() renvoie un ** tuple ** avec un descripteur de fichier ouvert. Tant que vous ne fermez pas ce handle, le fichier est utilisé (... par un autre processus: le vôtre). Il fonctionne sous Windows à cause du fonctionnement de os.remove() sur Windows, en essayant de supprimer un fichier en cours d'utilisation, une exception est levée, sur Unix, l'entrée du répertoire est supprimée mais le stockage alloué au fichier n'est pas rendu disponible jusqu'à ce que le fichier original ne soit plus utilisé_). –

Répondre

10

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