3

Следующая строка в моей Google App App Engine (webapp.py) не удается импортировать Google Cloud библиотеки:Невозможно использовать Google-облако в приложении GAE

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, которое может писать/читать из Google Cloud Storage, и я бы хотел протестировать локально до развертывания.

ответ

2

Существует App Engine specific Google Cloud Storage API, который поставляется с SDK App Engine, который вы можете использовать для работы с ведрами Cloud Storage.

import cloudstorage as gcs 

Есть ли причина, по которой вы не использовали эту встроенную библиотеку, которая не требует загрузки конфигурации?

+0

Я пробовал это после второго предложения atimothee, и это сработало! Мне было непонятно, что я должен использовать один над другим. – nefaurk

+0

Тот факт, что есть две библиотеки, довольно запутан. Попытка поиска одного из них, исключая другого, довольно сложна, но afaik 'cloudstorage' не поддерживает возобновляемые загрузки, а' google.cloud.storage' делает. – evertheylen

1

Ваш appengine_config.py должен содержать только:

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

Все остальное вы выложили выглядит хорошо для меня.

+0

Спасибо за предложение, dyeray! Я попытался заменить содержимое файла 'appengine_config.py' этим, и я все равно получаю ту же ошибку. Любые другие идеи? – nefaurk

+0

Я не знаю, где проблема. Он работает для меня, используя вышеуказанный код с довольно стандартным проектом с последней версией Google Cloud SDK и развертыванием с помощью приложения * gcloud app --project = *. Может быть, что-то еще происходит в вашем проекте? – dyeray

+0

О! Я пытаюсь запустить приложение локально, используя 'dev_appserver.py'. Это работает для вас в вашем проекте? – nefaurk

1

Пространство имен пакетов, по-видимому, было изменено, как указано в этом github issue и не было полностью исправлено. Вы можете установить более старую версию (pip install gcloud), которая использует различные пространства имен & использовать этот импорт заявление вместо:

from gcloud import storage 

Вы также должны убедиться, что вы импортируете поставщика LIBS в вашем appengine_config.py, как указано в ответе dyeray в ,

Проблема, похоже, была исправлена, как и в версии 0.20.0 google-cloud. Поэтому заявление импорта в вопросе должно работать. Просто не забудьте запустить pip install --upgrade google-cloud

+0

Если вас интересует облачное хранилище на appengine, вы можете просто использовать приложение Google Cloud Storage клиента https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/setting-up-cloud-storage – atimothee

+0

Вышеприведенный оператор импорта также не работает. Теперь я получаю: 'ИмпортError: Нет модуля с именем gcloud' – nefaurk

+0

Похоже, что клиентская библиотека Google Cloud Storage закончила работать для меня - спасибо, atimothee! – nefaurk

4

Похоже, что единственное, что требуется, это включить 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 
+0

Пробовал ваше предложение в тестовом проекте, но получил ту же ошибку: 'ImportError: Нет модуля с именем google.cloud.storage' – nefaurk

+0

вы запускаете dev-сервер, запустив' dev_appserver.py' или 'GoogleAppEngineLauncher'? – manRo

+0

Я использую 'dev_appserver.py', manRo. – nefaurk

0

вы должны переместить «импорта Google» строку в позиции после sys.path.insert

0

Я столкнулся с той же проблемой, и взял много времени, чтобы разобраться ,

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

Setup 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. Решение состоит в том, что вы можете либо следовать шаблону, как Setup 1, либо добавить следующие файлы в файл main.py.

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

Тогда приложение должно иметь правильный путь для импорта сторонних пакетов. Надеюсь, поможет.

Смежные вопросы