Modifica : vedi anche la risposta di Dave Jones : da Python 3.3, puoi usare il xflag open()per fornire questa funzione.
Risposta originale di seguito
Sì, ma non usando la open()chiamata standard di Python . Dovrai os.open()invece usare , che ti consente di specificare i flag per il codice C sottostante.
In particolare, vuoi usare O_CREAT | O_EXCL. Dalla pagina man di open(2)sotto O_EXCLsul mio sistema Unix:
Assicurati che questa chiamata crei il file: se questo flag è specificato insieme a O_CREAT, e il percorso esiste già, allora open()fallirà. Il comportamento di O_EXCLnon è definito se O_CREATnon è specificato.
Quando vengono specificati questi due flag, i collegamenti simbolici non vengono seguiti: se il percorso è un collegamento simbolico, open()fallisce indipendentemente da dove punta il collegamento simbolico.
O_EXCL è supportato solo su NFS quando si utilizza NFSv3 o successivo sul kernel 2.6 o successivo. Negli ambienti in cui O_EXCLnon viene fornito il supporto NFS , i programmi che si basano su di esso per l'esecuzione di attività di blocco conterranno una condizione di competizione.
Quindi non è perfetto, ma AFAIK è il massimo che puoi ottenere per evitare questa condizione di gara.
Modifica: le altre regole di utilizzo os.open()invece di sono open()ancora valide. In particolare, se vuoi usare il descrittore di file restituito per leggere o scrivere, avrai bisogno anche di uno dei flag O_RDONLY, O_WRONLYo O_RDWR.
Tutti i O_*flag sono nel osmodulo di Python , quindi dovrai import osusarli e così via os.O_CREAT.
Esempio:
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!")