2013-07-01 5 views
6

私のプログラムでは、ファイルが現在存在しない場合、多くのプロセスがファイルの作成を試みることができます。 ここでは、プロセスのうちの1つだけがファイルを作成でき、残りがすでに作成されている場合(プロセス安全でスレッドセーフなopen()実装の場合)、例外が発生するようにしたいと思います。 これをどのようにしてPythonで実現できますか?ファイルの作成方法と例外が既に存在する場合はスローする

私が望むのは、ファイルが存在しない場合、そのファイルが作成されることだけです。しかし、すでに存在する場合は例外をスローします。そして、これはすべて原子的に起こるはずです。

答えて

6

//docs.python:

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

このコードは、望ましい機能を実現します。 – Adobri

+0

@naxa、Python 3.3以降のドキュメント['open(...、 'x')'](https://docs.python.org/3/library/functions.html#open)には、 '情報;これは通常、すべてのプラットフォームをサポートすることを意味します。 Python 2.x ['os.fdopen'](https://docs.python.org/2/library/os.html#os.fdopen)のドキュメントでは、利用可能性について言及していますが、Unix、Windows。 – falsetru

+1

@naxa [documentation:open()フラグ定数](https://docs.python.org/2/library/os.html#open-flag-constants)によると、次の定数はフラグのオプションですパラメータをopen()関数に渡します。これらは、ビットごとのOR演算子|を使用して組み合わせることができます。それらの一部は、すべてのプラットフォームで使用できるわけではありません。使用可能性と使用方法の説明については、Unixのopen(2)マニュアルページまたはWindowsのMSDNを参照してください。 – falsetru

4

あなたはUnixライクなシステム上で実行している場合、このようなファイルを開く:

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

os.openO_EXCLフラグは、それはdoesnの場合は、ファイルのみを作成(および開く)されることを保証します既に存在しない場合、OSError例外が発生します。存在チェックと作成はアトミックに実行されるため、複数のスレッドまたはプロセスがファイルを作成することができ、1つだけが成功します。パイソン3.3+で

import os 

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

:Pythonの2.xで

+0

これらの定数の両方が[もWindows上で利用可能](HTTPであるべきです。 org/2/library/os.html#open-flag-constants)を参照してください。 –

+1

定数が利用可能かもしれませんが、私は、原子力がいくつかの研究なしで同じ方法で実装されていると主張しません。 – user4815162342

+0

私は尋ねたことは、ファイルが存在しない場合はそれを開きますが、存在する場合(すでに別のプロセスによって作成されている場合)、例外をスローするということでした。このコードは、ファイルが存在しない場合は例外をスローし、存在する場合は通過します。 – Adobri

関連する問題