【发布时间】:2020-05-07 01:09:08
【问题描述】:
我有一些代码在 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 中实例化记录器,希望不会持续存在对处理程序的引用——无论如何,我仍然看到这个错误。
我该如何解决这个问题?
【问题讨论】:
-
"temporary.log" 打开而不删除共享。即使它确实共享删除访问权限,只要日志处理程序引用该文件,“已删除”文件实际上仍会链接在目录中。 (在当前版本的 Windows 10 中,它将是未链接的 POSIX 样式,但您不能假设这一点。)这反过来会导致清理临时目录失败,因为它不会为空。
-
main函数可以保留对处理程序的引用以在finally块中调用logger.removeHandler(handler)。这将确保文件在main返回之前关闭。
标签: python windows logging file-permissions temporary-directory