¿Cómo accedo a una biblioteca suministrada desde un módulo en Google App Engine de Python?

Obtengo un ImportError cuando bash acceder a una biblioteca dentro del directorio lib en la raíz de mi aplicación.

Realicé los pasos necesarios en la documentación y funcionó con un solo módulo, pero una vez que me moví a esta estructura de directorio con varios módulos ya no funciona:

 | +-- appengine_config.py | +-- lib | +-- modules +-- module1 | +-- module2 

En mi appengine_config.py agrego la línea: vendor.add(os.path.join(os.path.dirname(__file__), 'lib'))

¿Alguna idea sobre lo que podría estar pasando aquí?

Editar: Esta estructura de directorio que parecía funcionar para mí:

  | +-- lib | +-- module1 | +-- appengine_config.py | | | +-- app.yaml | | | +-- lib  +-- module2 (same as module 1) 

Pensé que appengine_config.py era algo que debía definirse en el nivel de aplicación principal y no en el nivel de módulo. ¿Es correcto duplicar el mismo archivo exacto y el enlace simbólico en cada módulo?

Cada directorio de módulos se carga como una aplicación independiente y necesita todos sus archivos dentro de ese directorio de módulos (es decir, nada del directorio principal del módulo se carga / se ve en el módulo). El directorio del módulo es el que contiene el archivo .yaml del módulo, por lo que en su caso serán los modules/module1 y los modules/module2 dirs.

Entonces, vincule el directorio lib y el appengine_config.py desde el appengine_config.py de la aplicación a los directorios de los módulos. Además, para mi aplicación, como lo menciona Tim, la línea de vendedores que funciona es de hecho solo vendor.add('lib') . Copiarlos funciona igual de bien, pero la vinculación es mejor, ya que solo necesita mantener una copia en su sistema de control de versiones, con el espíritu DRY. El script appcfg.py sabe que debe seguir los enlaces simbólicos y cargar los archivos actuall a los que apuntan los enlaces simbólicos.

Si no necesita todas, sino solo algunas de las librerías de un módulo, puede crear un directorio lib en ese directorio de módulos y solo vincular los subdirectorios necesarios del directorio lib de la aplicación en el directorio lib del módulo correspondiente (para no cargar archivos innecesarios) .

Es posible que también necesite un enlace simbólico en algunos de los archivos de configuración del nivel de la aplicación del módulo para mantener satisfechos algunos de los scripts de soporte en el servidor de desarrollo, consulte esta respuesta: https://stackoverflow.com/a/34111170/4495081 . Tenga en cuenta que la actualización de las configuraciones a nivel de la aplicación puede no ocurrir simplemente al cargar el código de los módulos como se menciona en los tutoriales de aplicación de un solo módulo, deberán solicitarse explícitamente con los argumentos correspondientes de appcfg.py , como se menciona en el truco. hoja en esa respuesta.

¿Por qué incluye os.path.dirname ( archivo ) en vendor.add?

Mira los documentos. https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=es#vendoring

todo lo que necesita es vendor.add('lib') o, en el peor de los casos, vendor.add('lib/modules') .

¿Son los modules realmente un módulo / paquete?