2017-09-29 5 views
3

python docs for tempfile.NamedTemporaryFileは言う:Windows上でサブプロセスにNamedTemporaryFileを渡す

という名前の一時ファイルがまだ開いている間名前は、ファイルをもう一度開くために使用することができるかどうかは、プラットフォーム間で異なります(それができますUNIX上で使用されています; Windows NT以降では使用できません)。

私に触れることができないprog input.txtと呼ばれるプログラムがあります。私はこの文字列を与えるためにPython関数を記述したいと思います。

ここではかなり動作しない様々なアプローチです:窓

with NamedTemporaryFile() as f: 
    f.write(contents) 
    subprocess.check_call(['prog', f.name]) # legal on windows? 
  • に法的には早すぎる

    with NamedTemporaryFile() as f: 
        f.write(contents) 
        f.close() # does this delete the file? 
        subprocess.check_call(['prog', f.name]) 
    
    をファイルを削除する可能性がある場合

    from tempfile import NamedTemporaryFile 
    
    1. ない明らかに

    2. は適切に補正されているこれらの

      with NamedTemporaryFile(delete=False) as f: 
          f.write(contents) # if this fails, we never clean up! 
      try: 
          subprocess.check_call(['prog', f.name]) 
      finally: 
          os.unlink(f.name) 
      
    3. 少し醜い

      f = NamedTemporaryFile(delete=False) 
      try: 
          with f: 
           f.write(contents) 
          subprocess.check_call(['prog', f.name]) 
      finally: 
          os.unlink(f.name) 
      

    をクリーンアップしませんか?

  • 答えて

    0

    疑いがあるように、最初の3つの亜種はすべて壊れています - 最初はWindows上でPermissionErrorを投げます。 2番目のファイルは本当に早すぎるファイルを削除します。 3番目は例外を適切に処理しません。

    あなたの4番目のスニペットは正しい方法です。


    しかし、あなたが言ったように、それは少し醜いです。私たちはそのようにそれを使用することができます

    import os 
    from contextlib import contextmanager 
    from tempfile import NamedTemporaryFile 
    
    @contextmanager 
    def ClosedNamedTempfile(contents, mode='w'): 
        f = NamedTemporaryFile(delete=False, mode=mode) 
        try: 
         with f: 
          f.write(contents) 
         yield f.name 
        finally: 
         os.unlink(f.name) 
    

    with ClosedNamedTempfile('foobar\n') as f: 
        subprocess.check_call(['prog', f]) 
    
    +0

    これはまだ私のために動作しません私は読みやすさと再利用性を向上させるための機能でそれを包むことをお勧めします。 'f'にアクセスしようとしているサブプロセスは、ファイルが 'check_call'環境の中に存在しないことを報告します。 – jcoppens

    関連する問題