命令行脚本需要在存在之前清理它为使用而创建的临时文件。假设脚本在执行期间也可以中断。您应该在脚本中执行以下哪些操作?
a:) 使用 atexit 模块
b:) 使用 os.tempnam() 创建临时文件
c:) 定义 a_del_function
d:) 以上都不是
命令行脚本需要在存在之前清理它为使用而创建的临时文件。假设脚本在执行期间也可以中断。您应该在脚本中执行以下哪些操作?
a:) 使用 atexit 模块
b:) 使用 os.tempnam() 创建临时文件
c:) 定义 a_del_function
d:) 以上都不是
使用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)
您可以在此处定义自己的上下文管理器:
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(默认值),则文件一关闭就被删除。(或文件对象被垃圾回收时)
您可以将所有内容包装在try
/finally
子句中。清理部分finally
如下:
try:
# do everything
finally:
# cleanup logic
当您中断程序时,SystemExit
会引发异常,并finally
执行该子句。它允许做更一般的事情,而不仅仅是删除临时文件。
我会说 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()
都已经完成了。