我有一些代码可以在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
内部实例化记录器,以希望不会持久保留对处理程序的引用-无论如何,我仍然会看到此错误。
我该如何解决?
您需要关闭处理程序,从而关闭文件。然后,应该删除临时目录。我进行了如下更改:
# 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()
行,则它像以前一样失败。