2013-07-01 12 views
6

W moim programie wiele procesów może próbować utworzyć plik, jeśli plik obecnie nie istnieje. Teraz chcę się upewnić, że tylko jeden z procesów jest w stanie utworzyć plik, a reszta otrzyma wyjątek, jeśli już został utworzony (rodzaj bezpiecznego procesu i bezpieczna implementacja open(). Jak mogę to osiągnąć w python.jak utworzyć plik i wyrzucić wyjątek, jeśli już istnieje

Dla jasności, chcę, aby plik został utworzony, jeśli nie istnieje. Ale jeśli już istnieje, wyrzuć wyjątek. A to wszystko powinno się wydarzyć atomowo.

Odpowiedz

6

w Pythonie 2.x:

import os 

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

W Pythonie 3.3+:

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

Ten kod zapewnia pożądaną funkcjonalność. – Adobri

+0

@naxa, dokumentacja Pythona 3.3+ ['open (..., 'x')'] (https://docs.python.org/3/library/functions.html#open) nie ma żadnej dostępności 'informacja; co zwykle oznacza, że ​​obsługuje wszystkie platformy. Podczas gdy dokumentacja Pythona 2.x ['os.fdopen'] (https://docs.python.org/2/library/os.html#os.fdopen) wspomina o dostępności: Unix, Windows. – falsetru

+1

@naxa, zgodnie ze stałymi flagami [the documentation: open()) (https://docs.python.org/2/library/os.html#open-flag-constants): Poniższe stałe są opcjami dla flag parametr do funkcji open(). Można je połączyć za pomocą operatora bitowego OR |. Niektóre z nich nie są dostępne na wszystkich platformach. Aby uzyskać opisy ich dostępności i użycia, należy zapoznać się z podręcznikiem open (2) na stronie Unix lub MSDN w systemie Windows. – falsetru

4

Jeśli działa na systemach uniksowych, otwórz plik tak:

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

O_EXCL flagę os.open gwarantuje, że plik zostanie utworzony tylko (i otwarty), jeśli nie robi” t już istnieje, w przeciwnym razie zostanie zgłoszony wyjątek OSError. Sprawdzanie istnienia i tworzenie będzie wykonywane atomowo, więc możesz utworzyć wiele wątków lub procesów, aby utworzyć plik, a tylko jeden zakończy się sukcesem.

+0

Zarówno tych stałych powinno być [dostępny na Windows, jak również] (http: //docs.python. org/2/library/os.html # open-flag-constants). –

+1

Stałe mogą być dostępne, ale nie ośmielę się twierdzić, że atomowość jest realizowana w ten sam sposób, bez żadnych badań. – user4815162342

+0

Myślę, że prosiłem o to, że jeśli plik nie istnieje, otwórz go, ale jeśli istnieje (już utworzony przez inny proces), wtedy wyrzuć wyjątek. Wygląda na to, że ten kod wyrzuci wyjątek, jeśli plik tam nie będzie i przejdzie, jeśli istnieje. – Adobri

Powiązane problemy