命令行脚本需要清除它在创建之前为其使用而创建的临时文件。假设脚本也可以在执行期间中断。 你应该在脚本中做以下哪一项?
a :)使用atexit模块
b :)使用os.tempnam()创建临时文件
c :)定义a_del_function
d :)无以上
答案 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()
已经完成了这一切。