todas modulos lista librerias las importar python google-app-engine virtualenv google-cloud-platform python-import

modulos - Uso de dos bibliotecas de Python con nombres conflictivos



lista de modulos de python (1)

Quiero usar dos bibliotecas de Python (Google Cloud Library y su Cloud SDK ) en una sola aplicación, pero tienen nombres conflictivos (ambos usan google en sus nombres de importación base y no usan importaciones relativas internamente). ¿Cómo puedo usarlos en una sola aplicación?

Cambiar el código de la biblioteca para usar importaciones relativas correctas no es práctico. Además, sé que puedo usar virtualenv para acceder a estas bibliotecas desde aplicaciones separadas de Python, pero ¿cómo puedo acceder a ellas desde la misma aplicación de Python?

Detalles del conflicto de nomenclatura

Aquí hay algunos detalles sobre la importación. Cuando importo un módulo desde Cloud Library (ejecuto import google.cloud.datastore ), hay una excepción sobre otra importación dentro de esa biblioteca:

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

La biblioteca está tratando de hacer una importación absoluta, en lugar de una relativa. La razón por la que Google Cloud Library no puede importar google.cloud.datastore.batch es porque google ya está definido en el SDK, hay un conflicto de nomenclatura:

>>> print google.__path__ [''C://Program Files (x86)//Google//Cloud SDK//google-cloud-sdk//platform//google_appengine//google'']

Debido a que la Biblioteca de la Nube usa importaciones absolutas, y el nombre de google ya está definido en el SDK, la importación falla.


Los paquetes de google se encargan de registrarse como un paquete de espacio de nombres . Con un sys.path correctamente configurado no hay conflicto aquí .

Necesita configurar su entorno de biblioteca correctamente. Agregue un archivo appengine_config.py en la raíz de su proyecto con:

from google.appengine.ext import vendor # Add any libraries installed in the "lib" folder. vendor.add(''lib'')

Esto agrega el subdirectorio lib en la ubicación correcta de sys.path . Consulte la sección Instalación de una biblioteca de terceros en Developing Python Apps en App Engine How-To.

A partir de ahora, las importaciones de google.cloud solo funcionan :

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

y en el navegador me sirven:

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