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