En Python, comment puis-je faire un fichier temporaire qui persiste jusqu'à la prochaine course?

StackOverflow https://stackoverflow.com/questions/581851

  •  06-09-2019
  •  | 
  •  

Question

Je dois créer un dossier que j'utilise une seule fois, mais il faut l'avoir existe jusqu'à la prochaine exécution. Il semble que je devrais utiliser le module tmp_file dans la bibliothèque standard, mais je ne suis pas sûr de savoir comment obtenir le comportement que je veux.

À l'heure actuelle, je fais ce qui suit pour créer le répertoire:

randName = "temp" + str(random.randint(1000, 9999))
os.makedirs(randName)

Et quand je veux supprimer le répertoire, je regarde juste pour un répertoire « temp » en elle.
Cela semble être un sale hack, mais je ne suis pas sûr d'une meilleure façon pour le moment.

Par ailleurs, la raison pour laquelle j'ai besoin le dossier est autour que je commence un processus qui utilise le dossier avec les éléments suivants:

subprocess.Popen([command], shell=True).pid

et puis quittez mon script pour laisser l'autre processus terminer le travail.

Était-ce utile?

La solution

Création du dossier avec un nombre aléatoire à 4 chiffres est peu sûr, et vous devez également vous préoccuper des collisions avec d'autres instances de votre programme.

Une façon beaucoup mieux est de créer le dossier en utilisant tempfile.mkdtemp , qui fait exactement ce vous voulez (le dossier n'est pas supprimé lorsque votre script sort). Vous pouvez ensuite passer le nom du dossier au second script Popen'ed comme argument, et il serait responsable de la supprimer.

Autres conseils

Qu'est-ce que vous avez dit est dangereux. Vous pouvez avoir des conditions de course si quelqu'un d'autre essaie de créer ces répertoires - y compris d'autres instances de votre application. En outre, la suppression de tout ce qui contient « temp » peut entraîner la suppression de plus que vous prévu. Comme d'autres l'ont mentionné, tempfile.mkdtemp est probablement le moyen le plus sûr d'aller . Voici un exemple de ce que vous avez décrit, y compris le lancement d'un sous-processus pour utiliser le nouveau répertoire.

import tempfile
import shutil
import subprocess

d = tempfile.mkdtemp(prefix='tmp')
try:
    subprocess.check_call(['/bin/echo', 'Directory:', d])
finally:
    shutil.rmtree(d)

« Je dois créer un dossier que j'utilise une seule fois, mais il faut l'avoir existe jusqu'à la prochaine exécution. »

« Par ailleurs, la raison pour laquelle j'ai besoin le dossier est autour que je commence un processus ... »

Non accessoire, du tout. Crucial.

Il semble que vous avez le modèle de conception suivant.

mkdir someDirectory
proc1 -o someDirectory # Write to the directory
proc2 -i someDirectory # Read from the directory
if [ %? == 0 ]
then
    rm someDirectory
fi

Est-ce le genre de chose que vous écrirait au niveau shell?

Si oui, envisagez de casser votre demande Python en plusieurs parties.

  • Les pièces qui font le travail réel ( "PROC1" et "PROC2")

  • A Shell qui gère les ressources et les processus; essentiellement un remplacement Python pour un script bash.

Un fichier temporaire est quelque chose qui dure une seule exécution du programme.

Qu'est-ce que vous avez besoin est donc pas un fichier temporaire.

De plus, méfiez-vous de plusieurs utilisateurs sur une seule machine -. Simplement supprimer quoi que ce soit avec le motif « temp » pourrait être doublement antisocial, donc si le répertoire ne se trouve pas en toute sécurité de la route

De plus, rappelez-vous que sur certaines machines, le système de fichiers /tmp est reconstruit lors de la machine redémarre.

Vous pouvez également enregistrer automatiquement une fonction pour supprimer complètement le répertoire temporaire sur une sortie (avec ou sans erreur) en faisant:

import atexit
import shutil
import tempfile

# create your temporary directory
d = tempfile.mkdtemp()

# suppress it when python will be closed
atexit.register(lambda: shutil.rmtree(d))

# do your stuff...
subprocess.Popen([command], shell=True).pid

tempfile est très bien, mais d'être sur un côté sûr, vous aurez besoin d'un nom de répertoire sûr quelque part jusqu'à ce que le passage suivant, par exemple décaper il. lire ensuite dans le passage suivant et supprimer le répertoire. et vous n'êtes pas obligé d'avoir /tmp pour la racine, tempfile.mkdtemp a un paramètre dir en option pour cela. en gros, cependant, il ne sera pas différent de ce que vous faites actuellement.

La meilleure façon de créer le nom de fichier temporaire est soit en utilisant tempName.TemporaryFile (mode = 'w + b', suffixe = 'tmp', prifix = 'someRandomNumber' dir = None) ou u peut utiliser la fonction mktemp ().

La fonction mktemp () ne crée pas réellement un fichier, mais fournira un nom de fichier unique (ne fait pas contenir PID).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top