在Python模块中打开一个文件,并在脚本结束时将其关闭



我有一个Python模块,它在包含的一些方法中执行一些日志记录:

模块.py

LOG_FILE = "/var/log/module.log"
def log(message):
    with os.fdopen(os.open(LOG_FILE, os.O_RDWR | os.O_CREAT, 0664), "a+") as f:
        f.write("[%s] %sn" % (time.strftime("%c"), message))
def do_something():
    log("Doing something")
    # ...

在这个实现中,每次调用log方法时都会打开和关闭日志文件。

我正在考虑对其进行重构,以便在加载模块时打开一次文件,但我不确定如何确保在导入模块的脚本结束时关闭它。有干净的方法吗?

编辑:我不是在遇到异常时询问关闭文件,而是在导入我的模块的脚本退出时询问。

OS处理打开的文件描述符,然后进程终止。如果不刷新应用程序中的文件缓冲区,可能会导致数据丢失。您可以在每次写入后在log()函数中添加f.flush()(注意:它不能保证数据被物理写入磁盘,因此它仍然可能在电源故障时丢失,请参阅线程安全和容错文件写入)。

Python也可能在垃圾回收过程中在退出时关闭(并刷新)文件。但你不应该依赖它。

atexit仅在正常退出(以及某些信号退出)期间工作。如果剧本突然夭折,那也无济于事。

正如@RenéFleschenberg所建议的,使用logging模块来调用.flush(),并可能为您注册atexit处理程序。

Python通常非常擅长清理自身。如果必须在脚本结束时执行某些操作,则需要查看atexit模块,但即便如此,它也不能提供任何保证。

根据用途,您可能还需要考虑登录到stdoutstderr,这样可以避免将文件放在一起:

import sys
def log(message):
    sys.stderr.write("[%s] %sn" % (time.strftime("%c"), message))
当导入模块的脚本退出时,

Python将自动为您关闭打开的文件。

但实际上,只需使用Python的日志记录模块。

相关内容

  • 没有找到相关文章