1. ホーム
  2. python

[解決済み] ディレクトリ作成時にPythonの "FileExists "エラーが発生する

2022-02-25 21:08:26

質問

クラスタシステム上でPythonから複数のスレッドを並列に走らせています。各 Python スレッドは、以下のディレクトリに出力します。 mydir . 各スクリプトは、出力する前に、次のことをチェックします。 マイディレクトリ が存在し、存在しない場合は作成します。

if not os.path.isdir(mydir):
    os.makedirs(mydir)

が、これではエラーになります。

os.makedirs(self.log_dir)                                             
  File "/usr/lib/python2.6/os.py", line 157, in makedirs
mkdir(name,mode)
OSError: [Errno 17] File exists

レースコンディションが原因で、あるジョブで ディレ を先に実行します。このようなことはあり得るのでしょうか?もしそうなら、このエラーはどのように回避できるのでしょうか?

レースコンディションではないと思うので、Pythonの他の問題がこの奇妙なエラーを引き起こす可能性はないかと考えていました。

解決方法は?

何かをチェックしてからそれを実行するまでの間にコードが実行されることがあれば、いつでもレースコンディションを発生させることができます。これを避ける1つの方法(そしてPythonの通常の方法)は、単にtryしてから例外を処理することです。

while True:
    mydir = next_dir_name()
    try:
        os.makedirs(mydir)
        break
    except OSError, e:
        if e.errno != errno.EEXIST:
            raise   
        # time.sleep might help here
        pass

もし多くのスレッドが予測可能な一連のディレクトリを作ろうとすると、これでも多くの例外が発生しますが、最終的にはそこに到達することができます。そのような場合は、ディレクトリを作成するスレッドを1つだけにしたほうがよいでしょう。