2017-04-13 25 views
1

私は現在堅牢なアトミックファイルコピー

def _atomic_copyfile(src, dst, overwrite): 
    with tempfile.NamedTemporaryFile(dir=os.path.dirname(dst), 
            delete=False) as tmp_h: 
     with open(src, 'rb') as src_fd: 
      shutil.copyfileobj(fsrc=src_fd, 
           fdst=tmp_h) 
    if overwrite: 
     # works both on Windows and Linux from Python 3.3+, os.rename raises an 
     # exception on Windows if the file exists 
     os.replace(src=tmp_h.name, 
        dst=dst) 
    else: 
     if not os.path.exists(dst): 
      os.rename(src=tmp_h.name, 
         dst=dst) 

にはどうすれば例外がスローされたり、信号が捕捉されている場合、一時ファイルtmp_hが自動的に削除され作るのですか?

delete=Trueは一時ファイルの名前が変更されているため使用できません。動作するはずです何

+0

大きな 'try/except'でブロック全体を保護し、' tmp_h.name'を削除しようとしました(例外ハンドラで削除を保護してください) –

答えて

0

(私は通常、任意の例外なくtry/except:を使用していないだろうが、その場合には、それはうまく多分あなたはexcept場合のメッセージ、トレースバック、何を、追加したい、適用されます):

def _atomic_copyfile(src, dst, overwrite): 
    try: 
     with tempfile.NamedTemporaryFile(dir=os.path.dirname(dst), 
             delete=False) as tmp_h: 
     # your current code 
    except: 
     # maybe print something here to notify that an error occured 
     # instead of masking it 
     pass 
    finally: 
     try: 
      os.remove(tmp_h.name) 
     except: 
      pass 

finallyセクションのコードがファイルを削除しようとしています。失敗した場合は例外をキャッチし、何もしないでください(たとえば、ファイルが存在しないか、名前が変更された場合、または:tmp_h変数がまだ存在しない場合)

os.removeは、すでに存在しますが、あなたがwithコンテキストから外れているので、ファイルはすでに閉じられているため、ありそうもありません。

+1

最終的に 'tmp_h'が定義されていますか?範囲? –

+0

いいえ私はわかりませんが、私の答えはそれをカバーしています: "あるいは、tmp_h変数はまだ存在しません":あなたは例外を取得し、 –

関連する問題