我正在尝试将数据帧转换为 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 上的引擎,但没有任何改变
您没有指定文件的完整路径,因此很难确定它实际上在文件系统中的哪个位置尝试创建它。来自文档:
函数执行环境包括一个内存文件系统,其中包含随函数部署的源文件和目录(请参阅构建源代码)。包含源文件的目录是只读的,但文件系统的其余部分是可写的(操作系统使用的文件除外)。文件系统的使用计入函数的内存使用量。
因此,如果您最终尝试写入“包含源文件的目录”,我预计它会失败。相反,请考虑指定可写文件系统的完整路径。通常,此目录是位于 /tmp 的“临时”文件系统。但是,您应该使用 Python 提供的 API 来获取该路径,而不是对该路径进行硬编码,无论主机操作系统是什么。
请注意,在 Cloud Functions 中,写入磁盘的文件实际上会占用内存。如果写入太多数据,最终可能会耗尽内存并崩溃。您还应该在不再需要临时文件后立即删除它们。