如果脚本可以被中断,清理临时文件的最佳方法

时间:2013-09-01 10:51:18

标签: python

命令行脚本需要清除它在创建之前为其使用而创建的临时文件。假设脚本也可以在执行期间中断。 你应该在脚本中做以下哪一项?

a :)使用atexit模块

b :)使用os.tempnam()创建临时文件

c :)定义a_del_function

d :)无以上

4 个答案:

答案 0 :(得分:5)

使用try / finally执行clean-up。如果需要处理操作系统级别中断,请使用signals

Try / finally示例

try:
    create_temp_file()
finally:
    delete_temp_file()

信号示例

from signal import *
import sys

def clean(*args):
    delete_temp_file()
    sys.exit(0)

for sig in (SIGABRT, SIGBREAK, SIGILL, SIGINT, SIGSEGV, SIGTERM):
    signal(sig, clean)

答案 1 :(得分:2)

您可以将所有内容都包含在try / finally子句中。清理部分位于finally

之下
try:
    # do everything
finally:
    # cleanup logic

当您中断程序时,会引发SystemExit异常,并执行finally子句。 除了删除临时文件之外,它还允许做更多一般事情。

答案 2 :(得分:2)

您可以在此处定义自己的上下文管理器:

import os
class create_temp_file(object):
    def __enter__(self):
        """Define entry point actions here"""

        self.filename = os.tempnam()
        self.file_obj = open(self.filename, 'w')
        return self.file_obj

    def __exit__(self, ex_type, ex_value, ex_traceback):
        """define cleanup actions here"""

        self.file_obj.close()
        os.remove(self.filename)

现在使用with语句,这是做try-finally的pythonic方式

with create_temp_file() as f:
    #do something with file here

os.tempnam不安全,最好使用tempfile模块来执行此类操作。

  

RuntimeWarning:tempnam是您程序的潜在安全风险

import tempfile
with tempfile.NamedTemporaryFile('w', delete=True) as f:
   #do something with f here

如果delete为真(默认值),则文件一关闭就会被删除。(或者当文件对象被垃圾收集时)

答案 3 :(得分:0)

我会说d)以上都不是。

使用tempfile.NamedTemporaryFile选项为True delete,或者使用某些特定于平台的魔法让操作系统进行清理(已在os.tempfile()中包含)

在Windows上,您可以使用“D”标志打开以生成在最后一个句柄关闭时删除的文件:

with open(filename, "wD") as fd:
     ...

在Linux和其他POSIX系统上,您可以在文件仍处于打开状态时简单os.unlink该文件,其效果与为您清理完毕相同。

with open(filename, "w") as fd:
     os.unlink(filename)
     ...

但是我们最后都懒惰os.tmpfile()已经完成了这一切。