0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

tempfile.mkstempのPermissionErrorが発生した時の対処法

Posted at

基本的な事ですけど、ちょっと嵌ったので備忘録として記録
※ PermissionErrorが発生する原因は他にもありますので、この記事の対処法で治るとは限りません。

テスト書く時などに一時的なファイルが必要ならtempfileがおススメです。

tempfile.mkstemp()は一時ファイルを作成してくれますが、ファイル削除はユーザ自身が行う必要があります。
ファイル操作の後にos.remove()すればいいかなと思い、書いて実行した結果、PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\...[一時ファイルのパス]' のエラーが発生しました。

with構文は抜けてるけどなぁ…と思いながらも色々試した結果、tempfile.mkstemp()実行時のプロセスがファイルを掴んだままらしいので、os.close()してあげる必要がありました。

以下、上手く動作したテストの例

class MyFileController():
    def __init__(self, path):
        self.path = path
    
    def output(self, data):
        with open(self.path, "a", newline='', encoding='utf_8_sig', errors='ignore') as f:
            f.write(data)   

class TestMyFileController(unittest.TestCase):
    def test_output(self):
        fd, path  = tempfile.mkstemp()
        mcc = MyFileController(path)
        try:
            mcc.output("test")

            with open(path, encoding='utf_8_sig') as f:
                test_data = f.read()
                self.assertEqual(headers, "test")

        finally:
            os.close(fd)          # <-- ここね。
            os.remove(path)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?