

海外サイトも含め検索しましたが、有効な解決策を見つけることができませんでした。  
お知恵をお貸し頂けないでしょうか。  
OS：Windows

os.makedirs()を使いディレクトリを作成した際、実際にディレクトリが作成されるまでに”少々”の時間がかかります。  
後続処理では当然ながらos.path.isdir()を使ってディレクトリが生成済みであるかどうかを確認したうえでファイル転送を行うようにしていますが、  
PCスペックによりますが約50%の確率でディレクトリ生成より前に処理が進んでしまいチェックの網にかかってしまいます。

暫定処置としてos.makedirsの直後にtime.sleep(2)を埋め込んで時間をおいてから後続処理に進むようにしたところ表面的には解決しましたが、根本的には解決されていません。

そこで、ディレクトリの作成が終わったかどうか、もしくは、正常終了したのかどうかを何らかの戻り値で確認する方法はありますでしょうか。  
また、os.makedirsに限らず、スクリプトの処理とは別にOS側作業に時間がかかるような処理について戻り値を受け取ってから後続処理に進むような判定はできますでしょうか。

ディレクトリ生成はローカルとFTP先と両方で行っています。もしお分かりでしたら、ftplib.FTPで接続している場合のFTP接続先(いずれもWindowsPC同士)である場合に、ディレクトリ生成終了ステータスなどを拾える手段があるかについても教えて頂けないでしょうか。

【追記】  
コメントを頂きありがとうございます。ソースコードは以下のとおりです。

[code]

    try:
        if os.path.isdir(self.aaa):
            shutil.rmtree(self.aaa)
        os.makedirs(self.aaa)
        time.sleep(2)
    except Exception as e:
        print e
    try:
        if os.path.isdir(self.aaa):
            # ファイルコピー処理
         else:
            logger.info(u"まだ生成できていないです")
    except Exception as e:
        print e
    
[/code]


CC BY-SA 3.0
2018-04-22T02:39:08.077
43463
2018-04-22T15:38:09.297
2018-04-22T04:37:36.637
19110
question
python python2
os.makedirs が実際にディレクトリを作成するまで時間がかかる


Windowsの環境が手元になくLinuxで試してみましたが、下記の通りディレクトリが作成されるタイムラグは出ませんでした。

このコードを該当の環境で試して結果をお知らせ下さい。

[code]

    $ cat sample.py 
    #!/usr/bin/env python
    import os
    import shutil
    
    fname = "aaa"
    fpath = os.getcwd() + os.path.sep + fname
    
    try:
        if os.path.isdir(fpath):
            shutil.rmtree(fpath)
        os.makedirs(fpath)
        print os.path.isdir(fpath)
    except Exception as e:
        print e
    $ python sample.py 
    True
    $ python sample.py 
    True
    $ python sample.py 
    True
    $ python sample.py 
    True
    $ python sample.py 
    True
    $ 
    
[/code]

pythonのバージョンは下記の通りです。

[code]

    $ python --version
    Python 2.7.4
    $ 
    
[/code]


CC BY-SA 3.0
2018-04-22T05:32:38.090
43469
2018-04-22T05:32:38.090
5285
43463
answer


os.makedirsが返った時ディレクトリがキャッシュにしかできていない可能性があります。

このケースでは、直前に削除を行っていますが、大量のデータの削除をしていませんか。その場合、キャッシュの処理は終わり戻り値が帰ってきているが、ディスク本体の処理が終わっていないという状態になります。書き込みをしようするディレクトリー名が削除しているディレクトリー名が同じなので、削除処理が完了しないと処理が競合してしまのでエラーが発生することは十分考えられます。

とりあえず削除でなくて、ディレクトリー名の変更にしておいて、後で削除したらどうでしょうか。renameの処理は高速です。

[code]

    try:
        if os.path.isdir(self.aaa):
           os.rmname(self.aaa, self.aaa + '_bak')
        os.makedirs(self.aaa)
    except Exception as e:
        print e
    
    try:
        # ファイルコピー処理
    except Exception as e:
        print e
    
    if os.path.isdir(self.aaa + '_bak'):
        shutil.rmtree(self.aaa + '_bak')
    
[/code]


CC BY-SA 3.0
2018-04-22T06:42:55.287
43470
2018-04-22T15:38:09.297
2018-04-22T15:38:09.297
15171
15171
43463
answer