使用 Cloud Functions 和 python 写入 GCS 会出现 OSError: [Errno 30] 只读文件系统

问题描述 投票:0回答:1

我正在尝试将数据帧转换为 xlsx 并使用云函数将其写入谷歌云存储,但它不起作用。当我测试和部署时它起作用了,但是当我尝试使用 pub/sub 和调度程序触发时,它给出了“OSError:[Errno 30]只读文件系统”错误。代码如下:

bucket_name = 'bucket-main'
blob_name = 'file-reception/'

df = client.query(query).to_dataframe()
xlsx_file = 'test'
writer = pandas.ExcelWriter(xlsx_file)
df.to_excel(writer, index=False)

bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(blob_name+xlsx_file)
blob.upload_from_filename(xlsx_file)

搜索了很多它可能是什么,但真的不明白为什么云功能测试和部署有效(实际上是在 gcs 目录中写了 wile),但当我使用调度程序 + pub/sub 时却没有。

尝试更改 xlsxwritter 和 openpyxl 之间 df.to_excel 上的引擎,但没有任何改变

python google-cloud-functions google-cloud-storage google-cloud-pubsub google-cloud-scheduler
1个回答
0
投票

您没有指定文件的完整路径,因此很难确定它实际上在文件系统中的哪个位置尝试创建它。来自文档

函数执行环境包括一个内存文件系统,其中包含随函数部署的源文件和目录(请参阅构建源代码)。包含源文件的目录是只读的,但文件系统的其余部分是可写的(操作系统使用的文件除外)。文件系统的使用计入函数的内存使用量。

因此,如果您最终尝试写入“包含源文件的目录”,我预计它会失败。相反,请考虑指定可写文件系统的完整路径。通常,此目录是位于 /tmp 的“临时”文件系统。但是,您应该使用 Python 提供的 API 来获取该路径,而不是对该路径进行硬编码,无论主机操作系统是什么。

请注意,在 Cloud Functions 中,写入磁盘的文件实际上会占用内存。如果写入太多数据,最终可能会耗尽内存并崩溃。您还应该在不再需要临时文件后立即删除它们。

请参阅:如何在 Python 中创建临时目录?

© www.soinside.com 2019 - 2024. All rights reserved.