Editar : Vea también la respuesta de Dave Jones : desde Python 3.3, puede usar la xbandera open()para proporcionar esta función.
Respuesta original a continuación
Sí, pero sin usar la open()llamada estándar de Python . Deberá usar os.open()en su lugar, lo que le permite especificar indicadores en el código C subyacente.
En particular, desea utilizar O_CREAT | O_EXCL. Desde la página de manual de open(2)under O_EXCLen mi sistema Unix:
Asegúrese de que esta llamada cree el archivo: si este indicador se especifica junto con O_CREAT, y el nombre de ruta ya existe, open()fallará. El comportamiento de O_EXCLno está definido si O_CREATno se especifica.
Cuando se especifican estos dos indicadores, los enlaces simbólicos no se siguen: si el nombre de la ruta es un enlace simbólico, open()falla independientemente de dónde apunte el enlace simbólico.
O_EXCL solo es compatible con NFS cuando se usa NFSv3 o posterior en el kernel 2.6 o posterior. En entornos donde O_EXCLno se proporciona compatibilidad con NFS , los programas que dependen de él para realizar tareas de bloqueo contendrán una condición de carrera.
Así que no es perfecto, pero AFAIK es lo más cerca que puedes estar de evitar esta condición de carrera.
Editar: las otras reglas de uso en os.open()lugar de open()todavía se aplican. En particular, si desea utilizar el descriptor de archivo devuelto para leer o escribir, también necesitará uno de los indicadores O_RDONLY, O_WRONLYo O_RDWR.
Todas las O_*banderas están en el osmódulo de Python , por lo que necesitará import osusar, os.O_CREATetc.
Ejemplo:
import os
import errno
flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY
try:
file_handle = os.open('filename', flags)
except OSError as e:
if e.errno == errno.EEXIST: # Failed as the file already exists.
pass
else: # Something unexpected went wrong so reraise the exception.
raise
else: # No exception, so the file must have been created successfully.
with os.fdopen(file_handle, 'w') as file_obj:
# Using `os.fdopen` converts the handle to an object that acts like a
# regular Python file object, and the `with` context manager means the
# file will be automatically closed when we're done with it.
file_obj.write("Look, ma, I'm writing to a new file!")