¿Cómo modificar sys.path en Google App Engine (Python)?
-
23-09-2019 - |
Pregunta
He intentado añadir la siguiente línea a mi guión manipulador (main.py), pero no parece funcionar:
sys.path.append ( 'subdir')
subdir
vidas en el directorio raíz de mi (es decir, el app.yaml
uno que contiene).
Esto no parece funcionar, porque cuando trato de módulos de importación que viven en subdir
, mis explota aplicaciones.
Solución
1) Asegúrese de que tiene un archivo en blanco en __init__.py
subdir
.
2) utilizar una ruta completa; algo como esto:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
Editar: proporcionar más información para responder a las preguntas formuladas en un comentario.
Como Nick Johnson demuestra puede colocar esas tres líneas de código en una archivo llamado fix_path.py
. A continuación, en el archivo de main.py
, antes de hacer esto import fix_path
todas las demás importaciones. enlace a una aplicación de prueba utilizando esta técnica .
Y, sí, se requiere que el archivo __init__.py
; por el documentación :
Al importar el paquete, Python búsquedas a través de los directorios en sys.path buscando el paquete subdirectorio.
Los archivos están obligados a
__init__.py
hacer que Python trate los directorios como que contiene los paquetes; esto se hace para Evitar que los directorios con un común nombre, tales como cuerdas, desde involuntariamente ocultar módulos válidos que ocurrir más tarde en la búsqueda de módulos camino. En el caso más simple,__init__.py
simplemente puede ser un archivo vacío, pero también puede ejecutar la inicialización código para el paquete o establecer el variable de__all__
, descrito más adelante.
Otros consejos
A mí me funcionó la inserción de los nuevos directorios como las primeras entradas de sys.path.
path_changer.py:
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs'))
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'apps'))
app.py:
import path_changer
from google.appengine.ext.webapp.util import run_wsgi_app
from flask import Flask
import settings
app = Flask('myapp')
app.config.from_object('settings')
from website import views as website_views
run_wsgi_app(app)