Editar : Voir aussi Réponse de Dave Jones : à partir de Python 3.3, vous pouvez utiliser la fonction x
pour open()
pour assurer cette fonction.
Réponse originale ci-dessous
Oui, mais pas en utilisant la norme Python open()
appel. Vous aurez besoin d'utiliser os.open()
à la place, qui vous permet de spécifier des drapeaux pour le code C sous-jacent.
En particulier, vous voulez utiliser O_CREAT | O_EXCL
. Extrait de la page de manuel de open(2)
sous O_EXCL
sur mon système Unix :
Assurez-vous que cet appel crée le fichier : si ce drapeau est spécifié en conjonction avec O_CREAT
et le nom du chemin existe déjà, alors open()
échouera. Le comportement de O_EXCL
est indéfini si O_CREAT
n'est pas spécifié.
Lorsque ces deux drapeaux sont spécifiés, les liens symboliques ne sont pas suivis : si le chemin est un lien symbolique, alors open()
échoue quel que soit l'endroit vers lequel pointe le lien symbolique.
O_EXCL
n'est pris en charge sur NFS que si l'on utilise NFSv3 ou une version ultérieure sur le noyau 2.6 ou une version ultérieure. Dans les environnements où NFS O_EXCL
n'est pas fournie, les programmes qui s'appuient sur elle pour effectuer des tâches de verrouillage contiendront une condition de course.
Ce n'est donc pas parfait, mais je pense que c'est ce qui se rapproche le plus de cette condition de course.
Edit : les autres règles d'utilisation os.open()
au lieu de open()
s'appliquent toujours. En particulier, si vous souhaitez utiliser le descripteur de fichier retourné pour la lecture ou l'écriture, vous aurez besoin de l'une des méthodes suivantes O_RDONLY
, O_WRONLY
o O_RDWR
également des drapeaux.
Tous les O_*
se trouvent dans le langage Python os
vous devrez donc import os
et utiliser os.O_CREAT
etc.
Exemple :
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!")