편집 : Dave Jones의 답변 참조 : Python 3.3에서 x플래그를 사용 open()하여이 기능을 제공 할 수 있습니다 .
아래의 원래 답변
예,하지만 Python의 표준 open()호출을 사용하지 않습니다 . os.open()대신 사용 하여 기본 C 코드에 플래그를 지정할 수 있습니다.
특히 O_CREAT | O_EXCL. 내 Unix 시스템의 open(2)under O_EXCL에 대한 man 페이지에서 :
이 호출이 파일을 생성하는지 확인합니다.이 플래그가와 함께 지정 O_CREAT되고 경로 이름이 이미 존재 open()하면 실패합니다. 이 지정 O_EXCL되지 않은 경우 의 동작 은 정의되지 O_CREAT않습니다.
이 두 플래그가 지정되면 기호 링크를 따르지 않습니다. 경로 이름이 기호 링크이면 open()기호 링크가 가리키는 위치에 관계없이 실패합니다.
O_EXCL 커널 2.6 이상에서 NFSv3 이상을 사용하는 경우 NFS에서만 지원됩니다. NFS O_EXCL지원이 제공되지 않는 환경에서는 잠금 작업을 수행하기 위해 NFS 지원에 의존하는 프로그램에 경쟁 조건이 포함됩니다.
따라서 완벽하지는 않지만 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!")