【发布时间】:2021-07-23 15:55:38
【问题描述】:
我正在 lambda 函数中创建一个命名的临时文件,我认为我编写的代码可能存在问题。
我创建了一个命名文件,用于创建一个 excel 文件,然后我将命名文件引用传递给另一个函数以上传到存储桶,似乎进一步调用该函数最终导致磁盘已满。
我不完全确定为什么调用 close() 不会从磁盘上的任何位置删除文件。
这是我创建 excel 文件的函数:
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.
【问题讨论】:
-
打印对象类型和对象后,上面发布的来自 cloudwatch 的日志,可能有助于缩小范围。
-
最好在定义
tmp_file的同一范围内使用upload_renewel_report,或者让get_excel_file创建一个由收件人负责删除的常规文件。 -
或者让
get_excel_file接收一个打开的文件句柄作为参数,并让调用者担心该文件是如何创建的。 -
您正在创建一个有点奇怪的情况,因为临时文件至少被打开了两次(因为
s3_client.upload_file()需要打开它才能进行上传)。我在想也许第二次打开可能永远不会关闭 - 软件草率地关闭它打开的所有文件是相当普遍的,尤其是在阅读它们时)。
标签: python amazon-web-services aws-lambda temporary-files