我已经构建了一个应用引擎应用程序,使用谷歌应用引擎启动器将数据加载到bigquery表中但是当我在本地主机或云上运行它时,我使用google.cloud导入bigquery错误消息时得到名为cloud的No模块日志文件。我已经安装了谷歌云客户端库,但它仍然给我同样的错误。请参阅下面我正在使用的代码
--- main.py文件包含
import argparse
import time
import uuid
from google.cloud import bigquery
def load_data_from_gcs(dataset_name, table_name, source):
bigquery_client = bigquery.Client()
dataset = bigquery_client.dataset(dataset_name)
table = dataset.table(table_name)
job_name = str(uuid.uuid4())
job = bigquery_client.load_table_from_storage(
job_name, table, source)
job.begin()
wait_for_job(job)
print('Loaded {} rows into {}:{}.'.format(
job.output_rows, dataset_name, table_name))
def wait_for_job(job):
while True:
job.reload()
if job.state == 'DONE':
if job.error_result:
raise RuntimeError(job.error_result)
return
time.sleep(1)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('Test')
parser.add_argument('mytable')
parser.add_argument('gs://week/geninfo.csv')
args = parser.parse_args()
load_data_from_gcs(
args.dataset_name,
args.table_name,
args.source)
- app.yaml文件包含以下代码
application: mycloudproject
version: 1
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: .*
script: main.app
请告诉我遗失的内容或我在这里做错了什么?
答案 0 :(得分:5)
这可能有点棘手。 Google Cloud使用新的Python命名空间格式(如果您查看源代码,您会注意到目录结构中没有__init__.py
)。
使用PEP-420
在Python 3.3中对此进行了更改幸运的是,在Python 2.7中,您可以通过避免隐式导入来轻松解决此问题。只需将其添加到文件顶部:
from __future__ import absolute_import
希望有所帮助。
答案 1 :(得分:-1)
找到包含google/cloud/...
的目录,并将该目录添加到PYTHONPATH,以便python可以找到它。有关如何添加到PYTHONPATH的详细信息,请参阅this post。它概述了两种常见的方法:
以下是使用bash命令执行此操作的方法:
export PYTHONPATH=$PYTHONPATH:/<path_to_modules>
或者您可以将其附加到脚本中的路径:
# if the google/ directory is in the directory /path/to/directory/
path_to_look_for_module = '/path/to/directory/'
import sys
if not path_to_look_for_module in sys.path:
sys.path.append(path_to_look_for_module)
如果这不起作用,我在我的一个导入Google Appengine模块的项目中找到了一些代码:
def fixup_paths(path):
"""Adds GAE SDK path to system path and appends it to the google path
if that already exists."""
# Not all Google packages are inside namespace packages, which means
# there might be another non-namespace package named `google` already on
# the path and simply appending the App Engine SDK to the path will not
# work since the other package will get discovered and used first.
# This emulates namespace packages by first searching if a `google` package
# exists by importing it, and if so appending to its module search path.
try:
import google
google.__path__.append("{0}/google".format(path))
except ImportError:
pass
sys.path.insert(0, path)
# and then call later in your code:
fixup_paths(path_to_google_sdk)
from google.cloud import bigquery
答案 2 :(得分:-1)
您似乎试图在Cloud Datastore client library中使用Google App Engine's standard environment。正如文件in Google's documentation所述,你不应该这样做。相反,要么使用NDB Client Library,要么不使用标准环境。
答案 3 :(得分:-2)
您确定已更新到最新版本的库吗?由pip安装的版本可能已过期。以前,该模块导入为:
from gcloud import bigquery
如果可行,则表示您运行的是旧版本。要安装最新版本,我建议您从github project。
中提取主文件