无法在 GAE 应用程序中使用 google-cloud

Unable to use google-cloud in a GAE app

我的 Google App Engine 应用程序 (webapp.py) 中的以下行无法导入 Google Cloud 库:

from google.cloud import storage

出现以下错误:

ImportError: No module named google.cloud.storage

我做了一些研究,发现以下文章很有帮助:

结合使用上述文章建议的技术,我执行了以下操作:

  1. 创建一个 requirements.txt 文件:

    google-cloud==0.19.0
    
  2. 使用 pip 导入此库:

    pip install -t lib -r requirements.txt
    
  3. 在我的 appengine_config.py 文件中使用以下代码:

    import os
    import sys
    import google
    libDir = os.path.join(os.path.dirname(__file__), "lib")
    google.__path__.append(os.path.join(libDir, "google"))
    sys.path.insert(0, libDir)
    

任何人都可以阐明我可能缺少什么才能使它正常工作吗?我只是想编写一个 Google App Engine 应用程序,它可以 write/read 来自 Google 云存储,我想在部署之前在本地进行测试。

您的appengine_config.py只需要包含:

from google.appengine.ext import vendor
vendor.add('lib')

我觉得你发布的所有其他内容都很好。

包命名空间似乎已如本 github issue 中所指出的那样进行了更改,但尚未完全修复。您可以安装使用不同命名空间的旧版本 (pip install gcloud) 并改用此导入语句:

from gcloud import storage

您还应该确保在您的 appengine_config.py 中导入供应商库,如 dyeray 的回答中所指出的。

此问题似乎已在 google-cloud 的 0.20.0 版中得到解决。所以问题中的导入语句应该有效。记得 运行 pip install --upgrade google-cloud

有一个 App Engine specific Google Cloud Storage API 随 App Engine SDK 一起提供,您可以使用它来处理云存储桶。

import cloudstorage as gcs

您没有使用这个无需配置即可加载的内置库有什么原因吗?

看起来唯一需要做的就是将 google-cloud 包含到您的项目 requirements.txt 文件中。

检查这个简单示例是否适合您(您应该不会遇到任何导入错误)。 创建以下文件和 运行 pip install -r requirements.txt -t lib。我的网站上不需要其他任何东西就可以正常工作。

app.yaml

application: mysample
runtime: python27
api_version: 1
threadsafe: true

handlers:
  - url: /.*
    script: main.app

main.py

import webapp2
from google.cloud import storage


class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello, World!')

app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

appengine_config.py

from google.appengine.ext import vendor
import os

# Third-party libraries are stored in "lib", vendoring will make
# sure that they are importable by the application.
if os.path.isdir(os.path.join(os.getcwd(), 'lib')):
    vendor.add('lib')

requirements.txt

google-cloud

你应该将 "import google" 行移动到 sys.path.insert

之后的位置

我 运行 遇到了同样的问题,花了很长时间才解决。

设置 1: 如果您的 app.yaml 设置如下:

runtime: python27
api_version: 1
threadsafe: no

handlers:
- url: /.*
  script: main.app

libraries:
- name: jinja2
  version: "2.6"
- name: markupsafe
  version: "0.15

并且您的 main.py 已将您的脚本注册为应用程序:

from flask import Flask
app = Flask(__name__)
app.config['DEBUG'] = True

@app.route('/')
def hello():
    """Return a friendly HTTP greeting."""
    return 'Hello World!'

您应该能够 运行 在 google 云上正常运行。

设置2:我如何运行进入ImportModule error-
在我的 app.yaml 文件中,我将 script=main.app 替换为 script=main.app 并删除了

from flask import Flask
app = Flask(__name__)
app.config['DEBUG'] = True

来自 main.py file。结果,appengine_config.py 没有得到 运行 来设置 sys 路径。解决方案是您可以按照设置 1 中的模式或将以下内容添加到您的 main.py 文件中。

from google.appengine.ext import vendor
vendor.add('lib')

那么应用程序应该有正确的导入第三方包的路径。希望能帮助到你。