如何在AppEngine for Python中导入BigQuery

时间:2017-03-29 05:27:43

标签: python-2.7 google-app-engine google-bigquery

我正在尝试使用Python 2.7从Google AppEngine(已部署)运行BigQuery查询,但我在StackDriver的错误报告中看到了这个错误:

ImportError:没有名为cloud的模块

这是我的代码(main.py):

from __future__ import absolute_import

import webapp2
from google.cloud import bigquery


class MainPage(webapp2.RequestHandler):
    def get(self):

        # Instantiates a client
        bigquery_client = bigquery.Client()

        # The name for the new dataset
        dataset_name = 'my_new_set'

        # Prepares the new dataset
        dataset = bigquery_client.dataset(dataset_name)

        # Creates the new dataset
        dataset.create()

        # Remove unwanted chars
        #self.response.write(str(container))


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

这是我的(app.yaml):

runtime: python27
api_version: 1
threadsafe: true

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

错误消息会让我假设没有导入BigQuery的库。但是,如果在AppEngine中部署此代码,默认情况下该库是否已安装在AppEngine中?

尝试解决问题

尝试#1

我发现这篇帖子引用了类似的问题。建议是将此行添加到文件的顶部。我将该行添加到我的文件中,但问题仍然存在:

from __future__ import absolute_import

来源: No module named cloud while using google.cloud import bigquery

尝试#2

我在笔记本电脑中本地安装了BigQuery的客户端:

pip install google-cloud-bigquery==0.22.1

我还在" lib"中安装了相同的客户端。部署文件夹以将其上载到AppEngine:

pip install --target='lib' google-cloud-bigquery==0.22.1

最后,还需要一个名为" appengine_config.py"的文件。使用此内容创建:

# appengine_config.py
from google.appengine.ext import vendor

    # Add any libraries install in the "lib" folder.
    vendor.add('lib')

来源:https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27

但是,这种尝试也没有用。错误消息更改为以下内容:

*File "/base/data/home/apps/p~experimenting-1130/2.400173726395247238/lib/httplib2/__init__.py", line 352: print('%s:' % h, end=' ', file=self._fp) ^ SyntaxError: invalid syntax
at <module> (/base/data/home/apps/p~experimenting-1130/2.400173726395247238/lib/google_auth_httplib2.py:23)
at <module> (/base/data/home/apps/p~experimenting-1130/2.400173726395247238/lib/google/cloud/_helpers.py:31)
at <module> (/base/data/home/apps/p~experimenting-1130/2.400173726395247238/lib/google/cloud/bigquery/_helpers.py:21)
at <module> (/base/data/home/apps/p~experimenting-1130/2.400173726395247238/lib/google/cloud/bigquery/__init__.py:26)
at get (/base/data/home/apps/p~experimenting-1130/2.400173726395247238/main.py:75)
at dispatch (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:545)
at dispatch (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:547)
at __call__ (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:1077)
at default_dispatcher (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:1253)
at __call__ (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:1505)
at __call__ (/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py:1511)*

如何在AppEngine(已部署)中正确导入BigQuery库?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

以下解决方案对我有用,无需使用from __future__ import absolute_import。要遵循三个主要步骤。

1。将google-api-python-client和google-cloud复制到项目文件夹

根据documentation

,即使听起来违反直觉
  

[...] Python客户端库未安装在App Engine Python运行时环境中,[因此]它们必须像第三方库一样出售到您的应用程序中。

因此,为了使用google.cloud,必须将库代码复制到项目的源目录中。库代码以及应用程序代码将上载到App Engine。

将库代码复制到项目中:

  1. 创建一个目录(例如lib /)以在项目的根文件夹中存储第三方库

    mkdir lib
    
  2. 将google-api-python-client和google-cloud库复制到刚刚创建的文件夹中。我在下面的例子中使用了pip。

    pip install -t lib/ --upgrade google-api-python-client
    pip install -t lib/ --upgrade google-cloud
    
  3. 2。将已安装的库链接到app

    1. 在与appengine_config.py文件
    2. 相同的文件夹中创建名为app.yaml的文件
    3. 修改appengine_config.py并包含以下代码

      # appengine_config.py
      from google.appengine.ext import vendor
      
      # Add any libraries install in the "lib" folder.
      vendor.add('lib') 
      
    4. 3。将添加的库包含在requirements.txt

      1. 编辑requirements.txt文件并添加已添加库的名称

        # other requirements
        google-api-python-client
        google-cloud
        
      2. 部署应用后,您现在应该可以毫无问题地使用from google.cloud import bigquery

        有关详细信息,请参阅using third-party libraries