编辑:另见Dave Jones 的回答:从 Python 3.3 开始,您可以使用x
标志open()
来提供此功能。
原答案如下
是的,但不使用 Python 的标准open()
调用。您需要os.open()
改用它,它允许您为底层 C 代码指定标志。
特别是,您想使用O_CREAT | O_EXCL
. open(2)
在O_EXCL
我的 Unix 系统上的手册页中:
确保此调用创建文件:如果此标志与 一起指定O_CREAT
,并且路径名已经存在,open()
则将失败。如果未指定,则的行为O_EXCL
未定义。O_CREAT
当指定这两个标志时,不遵循符号链接:如果路径名是符号链接,则open()
无论符号链接指向何处都会失败。
O_EXCL
只有在内核 2.6 或更高版本上使用 NFSv3 或更高版本时,才在 NFS 上受支持。在不提供 NFSO_EXCL
支持的环境中,依赖它来执行锁定任务的程序将包含竞争条件。
所以它并不完美,但 AFAIK 是最接近避免这种竞争条件的方法。
编辑:使用os.open()
而不是其他规则open()
仍然适用。特别是,如果您想使用返回的文件描述符进行读取或写入,您还需要O_RDONLY
、O_WRONLY
或O_RDWR
标志之一。
所有O_*
标志都在 Python 的os
模块中,因此您需要import os
使用os.O_CREAT
等。
例子:
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!")