Python 如何从云函数在google存储桶中以二进制模式打开文件?

Python 如何从云函数在google存储桶中以二进制模式打开文件?,python,file-io,google-cloud-functions,google-cloud-storage,Python,File Io,Google Cloud Functions,Google Cloud Storage,在我的云函数中,我需要在云存储中获取一个文件,并通过HTTP POST请求将该文件发送到API。我尝试了以下代码: storage_client = storage.Client() bucket = storage_client.bucket(BUCKET_NAME) source_blob_name = "/compressed_data/file_to_send.7z" blob = bucket.blob(source_blob_name) url = UPLOAD

在我的云函数中,我需要在云存储中获取一个文件,并通过HTTP POST请求将该文件发送到API。我尝试了以下代码:

storage_client = storage.Client()
bucket = storage_client.bucket(BUCKET_NAME)
source_blob_name = "/compressed_data/file_to_send.7z"
blob = bucket.blob(source_blob_name)

url = UPLOADER_BACKEND_URL
files = {'upload_file': blob}
values = {'id': '1', 'ouid': OUID}
r = requests.post(url, files=files, data=values)
它给出了一个错误,说:

Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker_v2.py", ... 
 \ line 90, in encode_multipart_formdata body.write(data) TypeError: a bytes-like object is required, not 'Blob'
如果此代码要在实际VM上运行,则以下操作将起作用:

url = UPLOADER_BACKEND_URL
files = {'upload_file': open('/tmp/file_to_send.7z','rb')}
values = {'id': '1', 'name': 'John'}
r = requests.post(url, files=files, data=values)
所以问题是:在云函数中,如何从云存储加载文件,使其具有与python
open(filename,'rb')
函数相同的输出


我知道我可以做blob.download\u to_file()然后
open()
文件,但我想知道是否有更快的方法。

在您的云函数引用中,您不向API调用提供blob内容,只提供blob引用(文件路径+Bucket名称)

实际上,您可以在内存文件系统
/tmp
目录中本地下载该文件。然后将此tmp文件作为任何文件处理。上传后别忘了删除


您还可以尝试以python惯用方式处理文件。我在调用API时从未尝试过这样做,但它应该可以工作。

在您的云函数引用中,您不向API调用提供Blob内容,只提供Blob引用(文件路径+Bucket名称)

实际上,您可以在内存文件系统
/tmp
目录中本地下载该文件。然后将此tmp文件作为任何文件处理。上传后别忘了删除


您还可以尝试以python惯用方式处理文件。我在调用API时从未尝试过这样做,但它应该可以工作。

谢谢您的回答。当你说“上传后别忘了删除”时,我有点困惑。我认为当云函数完成执行时,本地文件将被自动删除。为什么必须删除
/tmp/
中的文件?
/tmp
是内存中的文件系统。卸载实例时,内容将消失。当函数运行时,它在实例上运行。在函数结束时,实例将保持运行,以防出现新的请求。如果不是,则在一段时间后卸载实例。但是,如果总是有请求,则使用相同的实例,并且需要清理/tmp目录以防止内存不足崩溃。这也意味着,如果您有全局变量(如db connexion),则可以在请求之间重用它们,直到卸载实例为止。谢谢您的回答。当你说“上传后别忘了删除”时,我有点困惑。我认为当云函数完成执行时,本地文件将被自动删除。为什么必须删除
/tmp/
中的文件?
/tmp
是内存中的文件系统。卸载实例时,内容将消失。当函数运行时,它在实例上运行。在函数结束时,实例将保持运行,以防出现新的请求。如果不是,则在一段时间后卸载实例。但是,如果总是有请求,则使用相同的实例,并且需要清理/tmp目录以防止内存不足崩溃。这也意味着,如果您有全局变量(如db connexion),则可以在请求之间重用它们,直到卸载实例为止。