Tengo un programa de Python que necesita crear un archivo temporal con nombre que se abrirá y cerrará un par de veces a lo largo del programa, y se eliminará cuando el programa finalice. Por desgracia, ninguna de las opciones en tempfile
parecen funcionar:¿Cómo creo un archivo temporal con nombre en Windows en Python?
TemporaryFile
no tiene un nombre visibleNamedTemporaryFile
crea un objeto de tipo fichero. Solo necesito un nombre de archivo. Intenté cerrar el objeto que devuelve (después de configurardelete = False
) pero recibo errores de transmisión cuando intento abrir el archivo más tarde.SpooledTemporaryFile
no tiene un nombre visiblemkstemp
devuelve el objeto de archivo abierto y el nombre; no garantiza el archivo se borra cuando el programa salemktemp
devuelve el nombre del archivo, pero no garantiza el archivo se elimina cuando el programa sale
He intentado usar mktemp
dentro un gestor de contexto, así:
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()
... pero eso me da un WindowsError(32, 'The process cannot access the file because it is being used by another process')
. El nombre del archivo es utilizado por un proceso que genera mi programa, y aunque me aseguro de que el proceso finalice antes de salir, parece que tengo una condición de carrera fuera de mi control.
¿Cuál es la mejor manera de lidiar con esto?
No es necesario preocuparse por la seguridad aquí; esto es parte de un módulo de prueba, por lo que la mayoría de las personas podrían hacer que nuestras pruebas de la unidad fracasen falsamente. ¡El horror!
Los problemas de seguridad no afectan el programa utilizando el archivo temporal, que afectan a todo el sistema el archivo temporal se crea en (por ejemplo, enlaces simbólicos a un importante archivo después de haber sido creado). –
¿Está seguro de que todos los objetos de archivo que abren el archivo temporal están cerrados correctamente? – user49117
El nombre de archivo se pasa a un proceso de Windows a través de Popen(), y cuando he terminado con esto, invoco .flush() en las transmisiones .sysin, .sysout y .syserr y luego invoco .wait() en el proceso. Eso está envuelto en un ContextManager, así que estoy seguro de que se llama. No estoy seguro de qué más podría estar haciendo. –