En Python, ¿cómo puedo hacer un archivo temporal que persiste hasta la próxima ejecución?

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

  •  06-09-2019
  •  | 
  •  

Pregunta

Es necesario crear una carpeta que uso una sola vez, pero hay que tenerlo existía hasta la próxima ejecución. Parece que debería usar el módulo tmp_file en la biblioteca estándar, pero no estoy seguro de cómo obtener el comportamiento que yo quiero.

Actualmente, estoy haciendo lo siguiente para crear el directorio:

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

Y cuando quiero eliminar el directorio, sólo busco un directorio con "temp" en ella.
Este parece ser un truco sucio, pero no estoy seguro de una mejor manera en este momento.

Por cierto, la razón por la que necesito la carpeta alrededor es que comienzo un proceso que utiliza la carpeta con la siguiente:

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

y salga de mi script para dejar que el otro proceso de terminar el trabajo.

¿Fue útil?

Solución

La creación de la carpeta con un número aleatorio de 4 dígitos es inseguro, y también hay que preocuparse por las colisiones con otras instancias de su programa.

Una forma mucho mejor es crear la carpeta usando tempfile.mkdtemp , que hace exactamente lo que desee (es decir, la carpeta no se elimina cuando el script finaliza). A continuación, pasa el nombre de la carpeta a la segunda secuencia de comandos Popen'ed como un argumento, y sería responsable de eliminarlo.

Otros consejos

Lo que se ha sugerido es peligroso. Es posible que tenga condiciones de carrera si alguien está tratando de crear esos directorios - incluyendo otras instancias de su aplicación. Además, la eliminación de cualquier cosa que contenga "temp" puede dar lugar a la supresión de más de lo previsto. Como otros han mencionado, tempfile.mkdtemp es probablemente la forma más segura de ir . Aquí está un ejemplo de lo que has descrito, incluyendo el lanzamiento de un subproceso para utilizar el nuevo directorio.

import tempfile
import shutil
import subprocess

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

"Tengo que crear una carpeta que uso una sola vez, pero hay que tenerlo existía hasta la próxima ejecución."

"A propósito, la razón por la que necesito la carpeta alrededor es que comienzo un proceso ..."

No es casual, en absoluto. Crucial.

Parece que tiene el siguiente patrón de diseño.

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

Es que el tipo de cosas que le escribiría a nivel concha?

Si es así, considere la fractura de su aplicación Python en varias partes.

  • Las partes que hacen el trabajo real ( "proc1" y "proc2")

  • Un Shell, que gestiona los recursos y los procesos; esencialmente un reemplazo de Python para una escritura del golpe.

Un archivo temporal es algo que dura para una sola ejecución del programa.

Lo que se necesita no es, pues, un archivo temporal.

Además, tenga cuidado de que varios usuarios en una sola máquina -. Acaba de borrar nada con el patrón 'temp' podría ser antisocial, por partida doble si el directorio no se encuentra de forma segura fuera del camino

Además, recuerde que en algunas máquinas, el sistema de archivos /tmp se actualiza cuando se reinicia el equipo.

También se puede registrar automáticamente una función para eliminar completamente el directorio temporal en cualquiera de las salidas (con o sin error) haciendo:

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á muy bien, pero para ser en un lado seguro que había necesidad de un nombre de directorio seguro en algún lugar hasta la próxima ejecución, por ejemplo decapar ella. luego leerlo en la siguiente ejecución y eliminar directorio. y usted no está obligado a tener /tmp para la raíz, tempfile.mkdtemp tiene un parámetro opcional para dir eso. por lo general, sin embargo, no va a ser diferente de lo que estás haciendo en este momento.

La mejor manera de crear el nombre de archivo temporal es ya sea usando tempName.TemporaryFile (modo = 'w + b', el sufijo = 'tmp', prifix = dir 'someRandomNumber' = None) o u puede utilizar la función de mktemp ().

La función mktemp () no genera realmente cualquier archivo, pero proporcionará un nombre de archivo único (en realidad no contiene PID).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top