Использование двух библиотек Python с конфликтующими именами

Я хочу использовать две библиотеки Python (Google Облако Библиотека, и Cloud SDK) в одном приложении, но они имеют конфликтующие имена (они оба используют google в их базовых именах импорта и не используйте относительный импорт внутри). Как я могу использовать их в одном приложении?

изменение кода библиотеки для использования правильного относительного импорта нецелесообразно. Кроме того, я знаю, что могу использовать virtualenv для доступа к этим библиотекам из отдельного python приложения, но как получить к ним доступ из того же приложения python?

подробности конфликта имен

вот некоторые из деталей импорта. Когда я импортирую модуль из облачной библиотеки (я запускаю import google.cloud.datastore), есть исключение о другом импорте в этой библиотеке:

>>> import libs.google.cloud.datastore
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:[ProjectDIR]libsgoogleclouddatastore__init__.py", line 52, in <module>
    from google.cloud.datastore.batch import Batch
ImportError: No module named cloud.datastore.batch

библиотека пытается сделать абсолютный импорт, а не относительный. Причина, по которой облачная библиотека Google не может импортировать google.cloud.datastore.batch - это потому, что google уже определено в SDK, существует конфликт именования:

>>> print google.__path__
['C:Program Files (x86)GoogleCloud SDKgoogle-cloud-sdkplatformgoogle_appenginegoogle']

потому что облачная библиотека использует абсолютный импорт и имя google уже определен в SDK, затем импорт завершается неудачно.

1 ответов


на google пакеты позаботятся о том, чтобы зарегистрироваться как пространство имен. С правильно настроенным sys.path здесь здесь нет конфликта.

вам необходимо правильно настроить среду библиотеки. Добавить appengine_config.py файл в корне вашего проекта:

from google.appengine.ext import vendor

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

добавляет lib подкаталог в правильном месте sys.path. Вижу установка сторонней библиотеки раздел in the разработка приложений Python на App Engine How-To.

отсюда на импорт google.cloud просто работать:

$ ls -1d lib *.py *.yaml
app.yaml
appengine_config.py
lib
main.py
$ pip install -t lib google-cloud
# installing into the lib subdirectory
$ cat main.py
import google
from google.cloud import datastore
from google.appengine.api import memcache
import os.path

here = os.path.dirname(os.path.abspath(__file__))

def app(*args, **kwargs):
    return '''
google: {}<br />
google.cloud.datastore: {}<br />
google.appengine.api.memcache: {}'''.format(
        os.path.relpath(google.__file__, here),
        os.path.relpath(datastore.__file__, here),
        os.path.relpath(memcache.__file__, here))

и в браузере мне подают:

google: ../google-cloud-sdk/platform/google_appengine/google/__init__.py
google.cloud.datastore: lib/google/cloud/datastore/__init__.pyc
google.appengine.api.memcache: ../google-cloud-sdk/platform/google_appengine/google/appengine/api/memcache/__init__.pyc