我正在lambda函数中创建一个命名的临时文件,我认为我编写的代码可能存在问题。
我创建了一个命名文件,用于创建一个excel文件,然后我将命名文件引用传递给另一个函数以上传到bucket,似乎该函数的进一步调用最终导致磁盘满。
我不完全确定为什么调用close()
不会从磁盘上的任何地方删除文件。
def get_excel_file(df_report):
tmp_file = tempfile.NamedTemporaryFile(suffix=".xlsx")
with pd.ExcelWriter(tmp_file.name) as writer:
df_report.to_excel(
writer, sheet_name="Report", index=False, startrow=4
)
writer.save()
return tmp_file
返回的文件tmp_file
然后被传递到下面的函数中进行上传,如果参数名为report
:
def upload_renewal_report(bucket_name, report, file_name):
s3_client.upload_file(report.name, bucket_name, file_name)
report.close()
是否有什么明显的错误的代码,这意味着文件没有得到清理?
报告,我关闭的对象输出为:
WHAT IS REPORT: <tempfile._TemporaryFileWrapper object at 0x7f9aeb9d42e0>
WHAT TYPE IS REPORT: <class 'tempfile._TemporaryFileWrapper'>
有一个已经被删除的注释,它似乎暗示我没有在临时文件上调用close。我确实调用了close()
似乎是临时文件,但似乎在上传到S3后,由于某种原因,文件已经关闭了。也许有一些东西,因为我直到现在才在日志中看到这个:
/opt/python/xlsxwriter/workbook.py:338: UserWarning: Calling close() on already closed file.
NamedTemporaryFile可能有些奇怪。我有一个测试,在linux上工作,但不是与你描述的确切行为的窗口。我修改了-
with NamedTemporaryFile(mode="w", delete=False) as f:
f.write(profile)
f.seek(0)
yield f.name
f.close()
os.unlink(f.name)
您也可能实际上不需要使用磁盘(如果文件对内存来说不是太大)
data = io.BinaryIO()
with pd.ExcelWriter(data) as writer:
df_report.to_excel(
writer, sheet_name="Report", index=False, startrow=4
)
s3_client.put_object(Body=data)