为什么无法在Windows上清除临时目录中的文件处理程序的文件?

问题描述 投票:2回答:1

我有一些代码可以在Unix系统上正常运行,但不能在Windows上运行。我想使其跨平台,但我的头撞在墙上。最小再现如下:

文件1:foo.py

import os
import sys
import logging

logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger('foo')

def main(dir):
    logger.addHandler(logging.FileHandler(
        os.path.join(dir, 'temporary.log')
    ))

    logger.info("Hello, world!")

文件2:main.py

from foo import main

import tempfile

if __name__ == "__main__":
    with tempfile.TemporaryDirectory("test") as tmp:
        main(tmp)

我期望的是将创建临时目录,将在其中发送日志的文件中创建一个文件,然后在tmp超出范围时将两者都清理掉。

相反,Windows提供了一个错误:

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: '...'

我尝试将FileHandler的模式从附加模式更改为非,我尝试手动清理文件和目录,并尝试将文件的创建延迟到其登录并刷新日志为止级别,甚至尝试在foo.main内部实例化记录器,以希望不会持久保留对处理程序的引用-无论如何,我仍然会看到此错误。

我该如何解决?

python windows logging file-permissions temporary-directory
1个回答
0
投票

您需要关闭处理程序,从而关闭文件。然后,应该删除临时目录。我进行了如下更改:

# foo.py
import os
import sys
import logging

logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger('foo')

def main(dir):
    h = logging.FileHandler(os.path.join(dir, 'temporary.log'))
    logger.addHandler(h)
    logger.info("Hello, world!")
    logger.removeHandler(h)
    return h

# main.py
from foo import main

import tempfile

if __name__ == "__main__":
    with tempfile.TemporaryDirectory("test") as tmp:
        print('Using temp dir %s' % tmp)
        h = main(tmp)
        h.close()

以下似乎有效:

~> python3 c:\temp\main.py
Using temp dir C:\Users\Vinay\AppData\Local\Temp\tmp60qirkhutest
INFO:foo:Hello, world!

~> dir AppData\Local\Temp\tmp60qirkhutest
 Volume in drive C has no label.
 Volume Serial Number is D195-0C0D

 Directory of C:\Users\Vinay\AppData\Local\Temp

File Not Found

如果注释掉h.close()行,则它像以前一样失败。

© www.soinside.com 2019 - 2024. All rights reserved.