Bearbeiten : Siehe auch Dave Jones 'Antwort : Ab Python 3.3 können Sie das xFlag verwenden open(), um diese Funktion bereitzustellen.
Ursprüngliche Antwort unten
Ja, aber nicht mit Pythons Standardaufruf open(). Sie müssen os.open()stattdessen verwenden, um Flags für den zugrunde liegenden C-Code anzugeben.
Insbesondere möchten Sie verwenden O_CREAT | O_EXCL. Von der Manpage für open(2)unter O_EXCLauf meinem Unix-System:
Stellen Sie sicher, dass dieser Aufruf die Datei erstellt: Wenn dieses Flag in Verbindung mit angegeben O_CREATwird und der Pfadname bereits vorhanden ist, schlägt dies open()fehl. Das Verhalten von O_EXCList undefiniert, wenn O_CREATnichts angegeben ist.
Wenn diese beiden Flags angegeben werden, werden symbolische Verknüpfungen nicht befolgt: Wenn der Pfadname eine symbolische Verknüpfung ist, open()schlägt dies fehl, unabhängig davon, wohin die symbolische Verknüpfung zeigt.
O_EXCL wird unter NFS nur unterstützt, wenn NFSv3 oder höher unter Kernel 2.6 oder höher verwendet wird. In Umgebungen, in denen O_EXCLkeine NFS- Unterstützung bereitgestellt wird, enthalten Programme, die für die Ausführung von Sperraufgaben darauf angewiesen sind, eine Race-Bedingung.
Es ist also nicht perfekt, aber AFAIK ist das Beste, was Sie tun können, um diese Rennbedingung zu vermeiden.
Bearbeiten: Die anderen Regeln für die Verwendung os.open()anstelle von open()weiterhin gelten. Insbesondere dann , wenn Sie den zurück Dateideskriptor zum Lesen oder Schreiben verwenden wollen, müssen Sie eine der benötigen O_RDONLY, O_WRONLYoder O_RDWRFahnen als auch.
Alle O_*Flags befinden sich im Python- osModul, Sie müssen also usw. import osverwenden os.O_CREAT.
Beispiel:
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!")