J'ai un programme Python qui doit créer un fichier temporaire nommé qui sera ouvert et fermé plusieurs fois au cours du programme, et devrait être supprimé quand le programme se termine. Malheureusement, aucune des options tempfile
semblent fonctionner:Comment créer un fichier temporaire nommé sur Windows en Python?
TemporaryFile
n'a pas un nom visibleNamedTemporaryFile
crée un objet de type fichier. J'ai juste besoin d'un nom de fichier. J'ai essayé de fermer l'objet qu'il renvoie (après avoir définidelete = False
) mais j'obtiens des erreurs de flux lorsque j'essaie d'ouvrir le fichier plus tard. N'a pas de nom visible.mkstemp
il ne garantit pas le fichier est supprimé lorsque le programme quittemktemp
retourne le nom du fichier, mais ne garantit pas le fichier est supprimé lorsque le programme quitte
J'ai essayé d'utiliser mktemp
dans les un gestionnaire de contexte, comme ceci:
def get_temp_file(suffix):
class TempFile(object):
def __init__(self):
self.name = tempfile.mktemp(suffix = '.test')
def __enter__(self):
return self
def __exit__(self, ex_type, ex_value, ex_tb):
if os.path.exists(self.name):
try:
os.remove(self.name)
except:
print sys.exc_info()
return TempFile()
... mais cela me donne un WindowsError(32, 'The process cannot access the file because it is being used by another process')
. Le nom de fichier est utilisé par un processus que mon programme engendre, et même si je m'assure que le processus se termine avant de quitter, il semble avoir une condition de course hors de mon contrôle.
Quelle est la meilleure façon de gérer cela?
Je n'ai pas à m'inquiéter de la sécurité ici; Cela fait partie d'un module de test, donc le plus néfaste des gens pourrait faire échouer faussement nos tests unitaires. L'horreur!
Les problèmes de sécurité ne touchent pas le programme en utilisant le fichier temporaire, ils affectent l'ensemble du système le fichier temporaire est créé sur (par exemple un lien symbolique à une importante fichier après qu'il a été créé). –
Etes-vous sûr que tous les objets fichier ouvrant le fichier temporaire sont correctement fermés? – user49117
Le nom de fichier est passé à un processus Windows via Popen(), et quand j'en ai fini, j'appelle .flush() sur les flux .sysin, .sysout et .syserr, puis j'appelle .wait() sur le processus. C'est enveloppé dans un ContextManager, donc je suis sûr que ça s'appelle. Je ne suis pas sûr de ce que je pourrais faire d'autre. –