2016-11-07 38 views
5

我已經建立了一個App Engine應用程序使用谷歌應用程序引擎啓動將數據加載到BigQuery資料表,但是當我本地主機上或雲中運行它,我得到評爲無模塊同時使用google.cloud在日誌文件中導入bigquery錯誤消息。我已經安裝了谷歌雲客戶端庫,但它仍然給我同樣的錯誤。請參閱我使用無模塊在使用google.cloud進口的BigQuery

---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

[應用ENGIN的可能的複製Ë項目將數據加載到BigQuery的不工作(http://stackoverflow.com/questions/40418201/app-engine-project-to-load-data-into-bigquery-not-working) –

+0

你能分享的輸出'python -v'?這可能會幫助您查看已加載哪些模塊以及從哪裏開始。 –

+0

輸出上有太多字符,不允許我在這裏發佈。有沒有其他的方式來分享我的文件? – LondonUK

回答

-1

你確定你已經更新到庫的最新版本?由pip安裝的版本可能已過期。以前,該模塊的導入方式如下:

from gcloud import bigquery 

如果可行,則運行的是舊版本。要安裝最新的,我建議從github project的主人拉。

+0

是的,我昨天安裝了庫,這仍然無法正常工作。我也將import語句更改爲您從gcloud import bigquery中建議的語句,但它仍然不起作用並給我一條錯誤消息 ImportError:沒有名爲gcloud的模塊 – LondonUK

3

這可能是一個有點棘手。谷歌雲使用新的Python的命名空間的格式(如果你看看源,你會注意到在目錄結構中沒有__init__.py)。

這在Python 3.3改爲與PEP-420

幸好在Python 2.7,你可以很容易地避免隱性進口解決這個問題。只需添加到您的文件的頂部:

from __future__ import absolute_import

希望有所幫助。

0

查找包含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) 

如果那是不行的,這裏是一些代碼,我在項目中的一個發現導入谷歌的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