3

命令行脚本需要在存在之前清理它为使用而创建的临时文件。假设脚本在执行期间也可以中断。您应该在脚本中执行以下哪些操作?

a:) 使用 atexit 模块

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

c:) 定义 a_del_function

d:) 以上都不是

4

4 回答 4

5

使用try/finally进行清理。如果您需要处理操作系统级别的中断,请使用信号

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)
于 2013-09-01T11:01:54.420 回答
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语句,这是pythonic的try-finally方式

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为 true(默认值),则文件一关闭就被删除。(或文件对象被垃圾回收时)

于 2013-09-01T11:29:53.957 回答
2

您可以将所有内容包装在try/finally子句中。清理部分finally如下:

try:
    # do everything
finally:
    # cleanup logic

当您中断程序时,SystemExit会引发异常,并finally执行该子句。它允许做更一般的事情,而不仅仅是删除临时文件。

于 2013-09-01T10:55:31.357 回答
0

我会说 d) 以上都不是。

要么使用True 选项,要么tempfile.NamedTemporaryFile使用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()都已经完成了。

于 2013-09-01T12:34:53.120 回答