2010-03-01 8 views
8

he intentado añadir la siguiente línea a mi guión manipulador (main.py), pero no parece funcionar:¿Cómo se modifica sys.path en Google App Engine (Python)?

sys.path.append ('subdirectorio')

subdir vive en mi directorio raíz (es decir, el que contiene app.yaml).

Esto no parece funcionar, porque cuando intento importar módulos que viven en subdir, mi aplicación explota.

+0

$ 10 dice que tenía un errante '.pyc' archivo si el error "se fijó". –

Respuesta

18

1) Asegúrese de tener un archivo en blanco __init__.py en subdir.

2) Use 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 preguntas hechas en un comentario.

As Nick Johnson demonstrates puede colocar esas tres líneas de código en un archivo llamado fix_path.py. Luego, en su archivo main.py, haga esto import fix_path antes que todas las demás importaciones. Link to a tested application using this technique.

Y, sí, se requiere el archivo __init__.py; por la documentation:

Al importar el paquete, Python búsquedas a través de los directorios en sys.path buscando el paquete subdirectorio.

Se requieren los archivos __init__.py para hacer que Python trate los directorios como que contienen paquetes; esto se hace a para evitar directorios con un nombre común, como cadena, desde ocultando involuntariamente los módulos válidos que se producen más adelante en la ruta de búsqueda del módulo . En el caso más simple, __init__.py puede ser solo un archivo vacío, pero también puede ejecutar el código de inicialización para el paquete o establecer la variable __all__, que se describe más adelante.

+0

No quiero crear un paquete llamado subdir. ¿No es eso lo que 1) va a hacer? Además, ¿dónde pondría el código que mencionaste en 2)? – allyourcode

+0

2) es la respuesta que estoy buscando. 1) Como explica su cita de los documentos, esto hace subdirir un paquete, que NO es lo que quiero. – allyourcode

+0

En realidad, no estoy seguro de por qué mi método original de agregar sys.path.append ('subdir') a main.py (el único controlador no estático en mi app.yaml) no funcionó. Lo intenté de nuevo, pero esta vez, sin explosión:/ – allyourcode

2

Me funcionó insertar los nuevos directorios como las primeras entradas en 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)