在Python模块中打开文件,并在脚本结束时关闭它

时间:2015-06-26 12:34:05

标签: python file

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

module.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] %s\n" % (time.strftime("%c"), message))

def do_something():
    log("Doing something")
    # ...

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

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

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

3 个答案:

答案 0 :(得分:2)

操作系统负责打开文件描述符,然后进程终止。如果未刷新应用程序内的文件缓冲区,则可能导致数据丢失。您可以在每次写入后在f.flush()函数中添加log()(注意:它不能保证数据物理写入磁盘,因此在电源故障时仍可能丢失,请参阅{{ 3}})。

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

atexit仅在正常退出期间工作(并在某些信号上退出)。如果脚本被突然杀死,它将无济于事。

作为Threadsafe and fault-tolerant file writes,请使用调用logging的{​​{1}}模块,并为您注册.flush()个处理程序。

答案 1 :(得分:1)

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

您可能还需要考虑记录到new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { // your code here } }, 5000 ); stdout,具体取决于目的,这样可以避免同时保存文件:

stderr

答案 2 :(得分:0)

当导入模块的脚本退出时,Python将自动关闭打开的文件。

但实际上,只需使用Python的logging module