Comment supprimer un répertoire créé avec tempfile.mkdtemp?
J'ai un programme en python qui crée les répertoires temporaires en vertu de l' /temp
en utilisant tempfile.mkdtemp
. Malheureusement, le programme Python n'a pas de supprimer le répertoire après l'avoir utilisé. Alors maintenant, l'espace disque est faible.
Questions:
- Comment puis-je supprimer les répertoires temporaires à gauche sous
/temp
manuellement? J'ai essayé de les supprimer manuellement, mais a eu erreur "autorisation refusée". - Dans le programme Python, comment faire pour supprimer
temp
répertoire après leur utilisation?
- Je ne pense pas que l'OP question a été comprise. La suggestion de code est un bon exemple de ce que vous devez écrire dans votre programme pour effacer le temp dirs créé. Cependant, si vous crashs de l'application (dur) sans la possibilité d'exécuter ce code de nettoyage? Ensuite, vous aurez un temp dir coups de pied autour de qui ne peut être supprimé que par le processus qui l'a créé (à moins que ce que les docs semblent indiquer) -- comment est-on censé nettoyer cela?
- Avez-vous essayé d'utiliser le compte root/admin?
- Sujet 1 (suppression manuelle): c'est un problème de permissions: réparer les autorisations et les supprimer, par exemple:
chmod -R +w /tmp/tmp0ytcxm9c && rm -fr /tmp/tmp0ytcxm9c
(si c'est une erreur de permission, vous devez être l'utilisateur qui a exécuté le programme, ou la racine).
Vous devez vous connecter pour publier un commentaire.
De gestion des ressources (comme des fichiers) en Python, la meilleure pratique consiste à utiliser la
avec
mot-clé, qui libère automatiquement les ressources (c'est à dire, nettoie, comme la fermeture des fichiers); il est disponible à partir de Python 2.5.De Python 3.2, vous pouvez utiliser
tempfile.TemporaryDirectory()
au lieu detempfile.mkdtmp()
– c'est utilisable danswith
et nettoie automatiquement le répertoire:Si vous utilisez une version antérieure de Python (au moins 2,5, ont donc
with
), vous pouvez utiliser backports.tempfile; voir Nicolas, Évêque de réponse à tempfile.TemporaryDirectory gestionnaire de contexte dans Python 2.7.C'est facile et instructif de rouler votre propre classe, appelée
gestionnaire de contexte. La valeur de retour de la
__enter__()
méthode est liée à la cible de laas
clause, alors que le__exit__()
méthode est appelée lorsque le contexte est sorti – même par exception, et effectue le nettoyage.Vous pouvez simplifier cette avec la
@contextlib.contextmanager
décorateur, de sorte que vous n'avez pas besoin d'écrire un gestionnaire de contexte manuellement. Le code avant layield
est exécutée lors de la saisie du contexte, de la donné valeur est liée à la cible de l'as
, et le code après leyield
est exécutée lorsque l'on sort du contexte. C'est fondamentalement un coroutine qui encapsule l'acquisition des ressources et de la libération, avec leyield
cession du contrôle de la suite (corps) de lawith
clause. Notez que vous ne besoin d'avoir untry...finally
bloc, comme@contextlib.contextmanager
ne pas intercepter des exceptions dans leyield
– ce juste les facteurs de la gestion des ressources dans une coroutine.Comme simplylizz des notes, si vous n'avez pas l'esprit de l'annuaire déjà été supprimés (dont le code ci-dessus suppose ne pas être le cas), vous pouvez prendre le “No such file or directory” exception comme suit:
Vous pouvez comparer avec le niveau de mise en œuvre dans
tempfile.py
; même ce simple de la classe a eu des bugs et a évolué au fil des ans.De fond sur
with
, voir:Lire la la documentation, c'est simple. 😉 De la documentation: le répertoire est lisible, modifiable et consultable uniquement par la création de l'utilisateur ID.
À supprimer le répertoire temp essayer quelque chose comme cela:
Vous pouvez également essayer tempdir de paquet ou de voir ses sources.
J'ai eu le même problème à l'aide de TemporaryDirectory() qui est essentiellement couvrant les fonctionnalités dont vous avez défini ci-dessus.
Mon problème était dû à l'utilisation du répertoire temporaire. J'ai utilisé pour remplir le contenu par clonage d'un dépôt git, il est arrivé qu'il y avait en lecture seule les fichiers créés au cours du processus et avec une sortie normale de ces en lecture seule les fichiers temporaires étaient à l'origine de la complète répertoire temporaire d'y rester.
N'héritent de la TemporaryDirectory à ma propre classe et de ne remplacer la méthode de la classe _cleanup avec le code suivant.
Le code avant de super() peut être optimisé, mais pour moi, la performance n'était pas le problème.
Solution a fonctionné pour Windows 10 avec Python 3
Je pense que l'utilisateur est responsable de la suppression temporaire répertoire et son contenu créé à l'aide de fichier temporaire.mkdtemp().
il ne sera pas supprimé automatiquement comme fichier temporaire.
Il existe de nombreuses façons que vous pouvez supprimer le répertoire
Si le répertoire est vide, vous pouvez utiliser
Remarque il peut être utilisé seulement si le répertoire est vide dans le cas contraire va augmenter
Cela permettra de supprimer l'intégralité du chemin d'accès au répertoire:
être prudent lors de l'utilisation de ce, il va supprimer tout le répertoire et les fichiers à l'intérieur.