【发布时间】:2022-08-20 00:23:38
【问题描述】:
我正在尝试运行一个 python 代码,它将从源 URL 下载数据块并将其流式传输到目标云存储 blob。 它在独立电脑、本地功能等中运行良好。 但是当我尝试使用 GCP Cloud RUN 时,它会抛出奇怪的错误。
AttributeError: \'GCSFile\' object has no attribute \'gcsfs\'
完全错误:
Traceback (most recent call last):
File \"/home/<user>/.local/lib/python3.9/site-packages/fsspec/spec.py\", line 1683, in __del__
self.close()
File \"/home/<user>/.local/lib/python3.9/site-packages/fsspec/spec.py\", line 1661, in close
self.flush(force=True)
File \"/home/<user>/.local/lib/python3.9/site-packages/fsspec/spec.py\", line 1527, in flush
self._initiate_upload()
File \"/home/<user>/.local/lib/python3.9/site-packages/gcsfs/core.py\", line 1443, in _initiate_upload
self.gcsfs.loop,
AttributeError: \'GCSFile\' object has no attribute \'gcsfs\'
它消耗了我的一周,任何帮助或方向都非常感谢,在此先感谢。
实际使用的代码:
from flask import Flask, request
import os
import gcsfs
import requests
app = Flask(__name__)
@app.route(\'/urltogcs\')
def urltogcs():
try:
os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = \"secret.json\"
gcp_file_system = gcsfs.GCSFileSystem(project=\'<project_id>\')
session = requests.Session()
url = request.args.get(\'source\', \'temp\')
blob_path = request.args.get(\'destination\', \'temp\')
with session.get(url, stream=True) as r:
r.raise_for_status()
with gcp_file_system.open(blob_path, \'wb\') as f_obj:
for chunk in r.iter_content(chunk_size=1024 * 1024):
f_obj.write(chunk)
return f\'Successfully downloaded from {url} to {blob_path} :)\'
except Exception as e:
print(\"Failure\")
print(e)
return f\'download failed for {url} :(\'
if __name__ == \"__main__\":
app.run(debug=True, host=\"0.0.0.0\", port=int(os.environ.get(\"PORT\", 8080)))
-
请显示您正在使用的代码。
-
感谢您的快速回复,我刚刚将代码添加到实际问题中。
-
你不应该
os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]=\"secret.json\"。gcsfs似乎使用应用程序默认凭据(请参阅Credentials),因此此步骤是不必要的,并且可以节省您将服务帐户机密放入部署工件(这是不安全的)。该代码将使用 Cloud Run 服务的(默认)身份,因此请确保您将其权限授予 GCS。 -
当您在本地运行代码时(删除该语句后),您可以
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/secret.json然后运行您的代码,应用程序默认凭据也将以这种方式验证您的代码。 -
完全同意@DazWilkin。避免使用显式机密。更喜欢本地环境变量,而不是云中的任何内容(您拥有为库提供凭据的元数据服务器)。您还可以通过执行
gcloud auth application-default login来避免使用密钥文件,以使用您的凭据。清理你的代码,它应该更清晰、更简单、更容易调试。
标签: google-cloud-platform python-3.7 google-cloud-run