2013-07-01 25 views
6

Nel mio programma, molti processi possono provare a creare un file se il file non esiste al momento. Ora voglio assicurarmi che solo uno dei processi sia in grado di creare il file e il resto ottenga un'eccezione se è già stata creata (tipo di implementazione sicura di processo e open safe). Come posso ottenere questo in Python.come creare un file e generare un'eccezione se esiste già

Solo per chiarezza, quello che voglio è che il file viene creato se non esiste. Ma se esiste già, lanciare un'eccezione. E tutto ciò dovrebbe accadere atomicamente.

risposta

6

In Python 2.x:

import os 

fd = os.open('filename', os.O_CREAT|os.O_EXCL) 
with os.fdopen(fd, 'w') as f: 
    .... 

In Python 3.3+:

with open('filename', 'x') as f: 
    .... 
+0

Questo codice raggiunge la funzionalità desiderata. – Adobri

+0

@naxa, Documentation of Python 3.3+ ['open (..., 'x')'] (https://docs.python.org/3/library/functions.html#open) non ha alcuna 'disponibilità 'informazione; questo di solito significa che supporta tutte le piattaforme. Mentre la documentazione di Python 2.x ['os.fdopen'] (https://docs.python.org/2/library/os.html#os.fdopen) parla della disponibilità: Unix, Windows. – falsetru

+1

@naxa, secondo [la documentazione: costanti flag open()] (https://docs.python.org/2/library/os.html#open-flag-constants): le seguenti costanti sono opzioni per le bandiere parametro alla funzione open(). Possono essere combinati utilizzando l'operatore OR bit a bit |. Alcuni di questi non sono disponibili su tutte le piattaforme. Per le descrizioni sulla loro disponibilità e utilizzo, consultare la pagina di manuale (2) aperta su Unix o MSDN su Windows. – falsetru

4

Se si esegue su un sistema Unix-like, aprire il file in questo modo:

f = os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL), 'w') 

La O_EXCL bandiera per os.open assicura che verrà creato il file solo (e aperto), se esso doesn' esiste già, altrimenti verrà sollevata un'eccezione OSError. Il controllo e la creazione dell'esistenza verranno eseguiti in modo atomico, quindi è possibile che più thread o processi si contendano per creare il file e ne verrà fuori solo uno.

+0

Entrambe queste costanti dovrebbero essere [disponibile su Windows così] (http: //docs.python. org/2/library/os.html #-bandiera-costanti aperti). –

+1

Le costanti potrebbero essere disponibili, ma non oserei affermare che l'atomicità è implementata nello stesso modo senza alcuna ricerca. – user4815162342

+0

Penso che quello che ho chiesto fosse, che se il file non esiste, aprirlo ma se esiste (già creato da un altro processo), quindi lanciare un'eccezione. Sembra che questo codice genererà un'eccezione se il file non è presente e passerà se esiste. – Adobri

Problemi correlati