Come si modifica sys.path in Google App Engine (Python)?
-
23-09-2019 - |
Domanda
Ho provato ad aggiungere la seguente riga al mio script handler (main.py), ma non sembra funzionare:
sys.path.append ( 'sottocartella')
subdir
vive nella mia directory principale (vale a dire la app.yaml
quello che contiene).
Questo non sembra funzionare, perché quando si tenta di importare i moduli che vivono in subdir
, i miei esplode app.
Soluzione
1) Assicurarsi di avere un file __init__.py
vuoto in subdir
.
2) Utilizzare un percorso completo; qualcosa di simile a questo:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
Modifica: fornire maggiori informazioni per rispondere alle domande poste in un commento.
Come Nick Johnson dimostra è possibile inserire quelle tre righe di codice in un file chiamato fix_path.py
. Poi, nel file main.py
, fare questo import fix_path
prima di tutte le altre importazioni. link a un'applicazione testato utilizzando questa tecnica .
E, sì, è necessario il file __init__.py
; per il :
Quando si importa il pacchetto, Python le ricerche attraverso le directory sys.path cercando per il pacchetto sottodirectory.
I file
__init__.py
sono tenuti a rendere Python tratti correttamente le directory come contenente pacchetti; questo è fatto per evitare che directory con un comune nome, ad esempio stringhe, da involontariamente nascondendo moduli validi che si verificano in seguito alla ricerca dei moduli sentiero. Nel caso più semplice,__init__.py
può essere un file vuoto, ma può anche eseguire l'inizializzazione codice per il pacchetto o impostare il variabile__all__
, descritto più avanti.
Altri suggerimenti
Ha funzionato per me l'inserimento delle nuove dirs 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)