2

在我在谷歌云虚拟机实例上运行的 python 服务器脚本中,它尝试在存储中保存图像(jpeg)。但它会引发以下错误。

文件“/home/thamendudj_16/server/object_detection/object_detector.py”,第 109 行,在检测手 new_img.save("slicedhand/{}#sliced_image{}.jpeg".format(threadname, i)) 文件中

“/home/thamendudj_16/.local/lib/python3.5/site-packages/PIL/Image.py”,第 2004 行,保存 fp = builtins.open(文件名,“w+b”)

OSError:[Errno 5] 输入/输出错误:'slicedhand/thread_1#sliced_image0.jpeg'

包括 python 脚本在内的所有文件都在谷歌存储桶中,并已使用 gcsfuse挂载到 VM 实例。应用程序尝试将新图像保存在slicedhand文件夹中。

发生图像保存的 Python 代码片段。

from PIL import Image

...
...

i = 0
new_img = Image.fromarray(bounding_box_img)      ## conversion to an image
new_img.save("slicedhand/{}#sliced_image{}.jpeg".format(threadname, i))

我认为可能是权限访问的问题。Doc 说要使用--key_file. 但是我应该使用什么密钥文件以及在哪里可以找到它。我不清楚这是问题还是其他原因。

任何帮助,将不胜感激。

4

1 回答 1

2

我了解到您在 Linux 虚拟机实例上使用gcfuse来访问 Google Cloud Storage。

密钥文件是服务帐户凭据密钥,可让您将 Cloud SDK 或客户端库作为另一个服务帐户启动。您可以从 Cloud Console 下载密钥文件。但是,如果您使用的是 VM 实例,则会自动使用 Compute Engine 默认服务帐户。您可以使用控制台命令检查它:$ gcloud init

正确配置您的凭据,请遵循文档

Compute Engine 默认服务帐户,需要启用 Access Scope Storage > Full。访问范围是限制云 API 访问级别的机制。这可以在机器创建期间或 VM 实例停止时完成。

请注意,访问范围是为您为 VM 实例选择的服务帐户明确定义的。

Cloud Storage对象名称有要求。强烈建议避免在对象名称中使用井号“#”。

于 2019-04-23T11:32:59.467 回答