Ошибка импорта модуля: как запустить клиентские библиотеки Google Cloud в Google Cloud SDK

Проблема

Я пытаюсь разработать базовое приложение Google App Engine. Я много занимаюсь наукой о данных, поэтому использую Anaconda для управления своими дистрибутивами Python.

Недавно я пытался настроить Google Cloud SDK + Google Cloud Client Libraries для разработки в GAE (в стандартной среде) и не могу заставить их работать вместе.

Я активировал среду Python 2.7 (py27), и когда я пытаюсь запустить базовое приложение, я получаю следующую ошибку:

  File "C:\Users\dominic\Anaconda3\envs\py27\lib\site-packages\google\cloud\bigquery\__init__.py", line 31, in <module>
    from pkg_resources import get_distribution
ImportError: No module named pkg_resources

Однако этот модуль существует в py27.

На интерактивной консоли, которую предоставляет SDK, я вижу, что она выполняет правильную версию python:

введите здесь описание изображения

import sys, os
print(os.path.dirname(sys.executable))

Возврат: C:\Users\dominic\Anaconda3\envs\py27

Поэтому я не могу понять, почему он не может найти эту конкретную библиотеку. Я подумал, что это может быть связано с необходимостью установить любые сторонние библиотеки в lib (в стандартной среде), так как только определенный набор предварительно загружен в движок приложения (и, следовательно, предположительно облачный SDK?), но когда я пытаюсь импортировать некоторые из предварительно загруженные библиотеки, такие как flask или futures (которые также установлены в этой среде python, они также не работают).

Как мне заставить библиотеки Google Cloud Client работать в Cloud SDK?

Что еще я пробовал

Я попытался добавить конкретную версию python в свой PYTHONPATH, на случай, если это было связано с Anaconda, управляющим моим путем, однако тогда Python полностью:

Error processing line 1 of C:\Users\dominic\Anaconda3\lib\site-packages\matplotlib-2.0.2-py3.6-nspkg.pth:

Failed to import the site module
Traceback (most recent call last):
  File "C:\Users\dominic\Anaconda3\lib\site.py", line 168, in addpackage
    exec(line)
  File "<string>", line 1, in <module>
  File "C:\Users\dominic\Anaconda3\lib\types.py", line 171, in <module>
    import functools as _functools
  File "C:\Users\dominic\Anaconda3\lib\functools.py", line 21, in <module>
    from collections import namedtuple
  File "C:\Users\dominic\Anaconda3\lib\collections\__init__.py", line 32, in <module>
    from reprlib import recursive_repr as _recursive_repr
  File "C:\Users\dominic\Anaconda3\envs\py27\Lib\site-packages\reprlib\__init__.py", line 7, in <module>
    raise ImportError('This package should not be accessible on Python 3. '
ImportError: This package should not be accessible on Python 3. Either you are trying to run from the python-future src folder or your installation of python-future is corrupted.

Мне нужно сохранить Anaconda в качестве основной установки Python (для рабочих целей), но я также хотел бы иметь возможность разрабатывать с помощью Cloud SDK.

Окружающая среда

  • Windows 7
  • Anaconda для установки Python.
  • Python 3.6 - основная версия
  • У меня есть среда conda py27, в которой я разрабатываю.
  • Google Cloud SDK установлен и аутентифицирован
  • google-cloud-bigquery установлен в py27

person Dominic Woodman    schedule 07.02.2018    source источник
comment
Вы ориентируетесь на стандартную или гибкую среду? Огромная разница между ними. См. stackoverflow.com/questions/45842772/.   -  person Dan Cornilescu    schedule 08.02.2018
comment
Хороший вопрос @DanCornilescu. Уточнил в вопросе.   -  person Dominic Woodman    schedule 08.02.2018


Ответы (1)


Библиотека google-cloud-bigquery не входит в комплект поставки GAE для стандартной среды env, поэтому вам необходимо поставьте его в свое приложение (GAE не волнует, установлен ли он в вашу локальную установку Python). Ваша трассировка указывает, что это происходит из локальной установки, обратите внимание на строку py27\lib\site-packages\google\cloud\bigquery в ней.

Также следует отметить, что стандартный env поддерживает только приложения, разработанные для GAE, выполняемые через песочницу, а не общие автономные приложения. Неясно, принадлежит ли основное приложение, которое вы пробовали, к тому или иному типу. См. import cloudstorage, ImportError: нет модуля с именем google .appengine.api.

Что касается flask или других библиотек, предоставляемых GAE, вам необходимо запросить их в вашем app.yaml файле (лично я бы использовал там явную версию вместо latest, я думаю, что я видел некоторые проблемы, которые могут быть связаны с latest). Здесь следует отметить, что некоторые из этих библиотек / версий не установлены по умолчанию в облачном SDK, возможно, потребуется установить дополнительный компонент app-engine-python-extras, см. PyCharm - Невозможно создать приложение App Engine с помощью DJango.

Что касается вашей последней попытки:

  • на всякий случай, обратите внимание, что стандартный env поддерживает только python 2.7, python 3 работать не будет. Строка This package should not be accessible on Python 3 может указывать на то, что попытка могла быть сделана с использованием python 3. Вам нужно будет явно использовать исполняемые файлы python 2.7, поскольку ваша основная версия - python 3.
  • matplotlib - одна из немногих библиотек, предоставляемых GAE, которая требует особого внимания для локальной разработки с использованием SDK, см. Использование встроенных связанных библиотек с локальным сервером разработки
person Dan Cornilescu    schedule 08.02.2018
comment
Привет, это было действительно полезно. Итак, чтобы убедиться, что я понял: все библиотеки, которые включены в стандартный env, должны быть включены в файл app.yaml. Все, что не нужно, следует устанавливать в lib. Я знал, что могу использовать только python 2.7, но я не был уверен, какую переменную env использовать. Моя ошибочная попытка использовать PYTHONPATH была связана с тем, что я не наткнулся на GOOGLE_APPLICATION_CREDENTIALS для аутентификации. Еще раз спасибо, Дэн, очень признателен! - person Dominic Woodman; 09.02.2018
comment
Ага. Я предполагаю, что под all libraries вы имеете в виду только те, которые вам нужно использовать в приложении. - person Dan Cornilescu; 09.02.2018
comment
хаха да. Мне еще предстоит написать приложение, которому нужны все библиотеки. - person Dominic Woodman; 09.02.2018