Использование двух библиотек 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