2010-03-01 14 views
8

Ho provato ad aggiungere la seguente riga al mio script handler (main.py), ma non sembra funzionare:Come si modifica sys.path in Google App Engine (Python)?

sys.path.append ('sottocartella')

subdir risiede nella directory principale (ovvero quella contenente app.yaml).

Questo non sembra funzionare, perché quando provo a importare i moduli che vivono in subdir, la mia app esplode.

+0

$ 10 dice che ha avuto un errante '.pyc' file se l'errore "si fissa". –

risposta

18

1) Assicurarsi di disporre di un file vuoto __init__.py in subdir.

2) Utilizzare un percorso completo; qualcosa di simile:

import os 
import sys 

sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir')) 

Edit: fornire maggiori informazioni per rispondere alle domande poste in un commento.

As Nick Johnson demonstrates è possibile inserire queste tre righe di codice in un file denominato fix_path.py. Quindi, nel file main.py, fare questo import fix_path prima di tutte le altre importazioni. Link to a tested application using this technique.

E, sì, è necessario il file __init__.py; per la documentation:

Quando si importa il pacchetto, Python ricerche attraverso le directory su sys.path cercando per il pacchetto sottodirectory.

I file __init__.py sono necessari per fare in modo che Python tratti le directory come pacchetti contenenti ; questo viene fatto per impedire che le directory con un nome comune , come una stringa, da nascondano involontariamente moduli validi che si verificano in seguito sul percorso di ricerca modulo . Nel caso più semplice, __init__.py può essere solo un file vuoto, ma può anche eseguire il codice di inizializzazione per il pacchetto o impostare la variabile __all__ , descritta in seguito.

+0

Non voglio creare un pacchetto chiamato subdir. Non è questo che farò 1)? Inoltre, dove dovrei inserire il codice che hai citato sotto 2) ?? – allyourcode

+0

2) è la risposta che sto cercando. 1) Come spiega la tua citazione dai documenti, questo rende subdir un pacchetto, che NON è quello che voglio. – allyourcode

+0

In realtà, non sono sicuro del perché il mio metodo originale di aggiungere sys.path.append ('subdir') a main.py (l'unico gestore non statico nel mio app.yaml) non ha funzionato. Ho appena provato di nuovo, ma questa volta, nessuna esplosione:/ – allyourcode

2

Ha funzionato per me inserendo le nuove directory come le prime voci in 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)