Bonne façon de nettoyer un dossier temporaire en Python classe
Je suis la création d'une classe dans laquelle je veux générer un espace de travail temporaire de dossiers qui seront conservés pour la durée de vie de l'objet et ensuite être retiré. Je suis à l'aide de fichier temporaire.mkdtemp() dans la def init pour créer de l'espace, mais j'ai lu que je ne peux pas compter sur del appelé.
Je suis désireux quelque chose comme ceci:
class MyClass:
def __init__(self):
self.tempfolder = tempfile.mkdtemp()
def ... #other stuff
def __del__(self):
if os.path.exists(self.tempfolder): shutil.rmtree(self.tempfolder)
Est-il une autre/meilleure façon de gérer cela nettoyer? Je lisais à propos de "avec", mais il semble seulement être utile au sein d'une fonction.
- Je pense que les seules solutions fiables impliquera toujours faire le nettoyage de manière explicite. Je ne pense pas que l'automatique fiable de nettoyage solution à envisager dans votre question, c'est possible.
- faux: Python contexte, les gestionnaires sont exactement à cette fin.
- même contexte, les gestionnaires doivent être explicitement entrée.
- oui, mais vous avez toujours besoin pour ouvrir un fichier. Le point d'un gestionnaire de contexte est qu'il ne gère nettoyage.
Vous devez vous connecter pour publier un commentaire.
Mise en garde: vous ne pouvez jamais garantie que le dossier temp sera supprimé, car l'utilisateur peut toujours dur de tuer vos processus et il ne peut pas exécuter quoi que ce soit d'autre.
Cela dit, ne
Puisque c'est une opération très courante, Python a une façon particulière pour encapsuler "faire quelque chose, d'exécuter du code, clean up": un gestionnaire de contexte. Vous pouvez écrire votre propre comme suit:
et l'utiliser comme
(Notez que cette fonction utilise la
@contextlib.contextmanager
de raccourci pour créer un gestionnaire de contexte. Si vous souhaitez mettre en place une façon originale, vous avez besoin de faire une classe personnalisée avec__enter__
et__exit__
méthodes; l'__enter__
serait de créer et retourner le répertoire temp et le__exit__
le supprimer.with
déclaration est qu'elle ferme l'objet lorsque vous le quittez. Si vous voulez que votre répertoire temp de fermer quelque part d'autre, vous devez fermer explicitement il y et de gérer les exceptions de vous-même.try...except...finally
déclaration pour intercepter l'erreur (le cas échéant), ou à faire en sorte que le nettoyage a lieu."tempfile.TemporaryDirectory()
qui fait la même chose que cette réponse montre. Pour 3.2 et versions plus récentes je voudrais utiliser le module de bibliothèque de code; pour les anciennes versions de Python je voudrais utiliser ce code, mais je voudrais renommer la fonction deTemporaryDirectory()
et le document qu'il est similaire à la 3.2 code. docs.python.org/3/library/tempfile.htmlUne belle façon de traiter avec des fichiers temporaires et des répertoires est par l'intermédiaire d'un gestionnaire de contexte. C'est de cette façon que vous pouvez utiliser tempfile.TemporaryFile ou tempfile.NamedTemporaryFile -- une fois que vous avez quitté le
with
déclaration (via la sortie normale, de retour, d'exception, ou quoi que ce soit d'autre) le fichier/répertoire et son contenu seront supprimés à partir du système de fichiers.Pour Python 3.2+, c'est construit comme tempfile.TemporaryDirectory:
Pour les précédentes versions de Python, vous pouvez facilement créer votre propre gestionnaire de contexte pour faire exactement la même chose. Les différences de @katrielalex réponse sont le passage d'arguments pour
mkdtemp()
et le try/finally bloc assurez-vous que le répertoire obtient nettoyé si une exception est levée.Notez que si votre processus est dur tué (par exemple.
kill -9
) puis les répertoires ne le seront pas nettoyés.Comme l'a déclaré Bluewind vous avez à faire assurez-vous d'envelopper le rendement de la part du gestionnaire de contexte à l'intérieur d'un essai: instruction enfin sinon aucune exception ne sera pas manipulé correctement à l'intérieur du gestionnaire de contexte.
De Python 2.7 docs
Aussi, si vous êtes à l'aide de Python 3.2+ vous devriez vérifier ce petit bijou qui dispose de tous les ci-dessus enveloppé bien pour vous
Une autre alternative à l'aide
contextlib
est de faire de votre objet refermable, et l'utilisation de lafermeture
gestionnaire de contexte.Puis avec le gestionnaire de contexte:
D'autres réponses ont noté que vous pouvez utiliser un contextmanager ou besoin de vos utilisateurs à appeler explicitement un certain type de fonction nettoyage. Ce sont de grand à faire si vous le pouvez. Cependant, parfois, il n'y a pas à s'accrocher cette de nettoyage parce que vous êtes à l'intérieur d'une grande application et vous sont imbriqués plusieurs couches vers le bas, et personne au dessus de vous a des méthodes de nettoyage ou de contexte, les gestionnaires.
Dans ce cas, vous pouvez utiliser atexit: https://docs.python.org/2/library/atexit.html