Comment modifier sys.path dans Google App Engine (Python)?
-
23-09-2019 - |
Question
Je l'ai essayé d'ajouter la ligne suivante à mon script de gestionnaire (de main.py), mais il ne semble pas fonctionner:
sys.path.append ( 'subdir')
subdir
vit dans le mon répertoire racine (à savoir celui qui contient de app.yaml
).
Cela ne semble pas fonctionner, parce que quand je tente d'importer des modules qui vivent dans subdir
, mes explose app.
La solution
1) Assurez-vous que vous avez un fichier vide dans __init__.py
subdir
.
2) Utiliser un chemin d'accès complet; quelque chose comme ceci:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
Edit: fournir plus d'informations pour répondre aux questions posées dans un commentaire.
Comme Nick Johnson montre vous pouvez placer ces trois lignes de code dans un fichier appelé fix_path.py
. Ensuite, dans votre fichier main.py
, faire import fix_path
avant toutes les autres importations. Lien vers une application testée à l'aide de cette technique .
Et, oui, le fichier __init__.py
est nécessaire; par :
Lors de l'importation du paquet, Python des recherches dans les répertoires sys.path recherche du paquet sous-répertoire.
Les fichiers
__init__.py
doivent faire Python traiter les répertoires comme contenant des paquets; cela se fait à éviter les répertoires avec une commune nom, comme chaîne, de cacher involontairement modules valides qui se produisent plus tard sur la recherche du module chemin. Dans le cas le plus simple,__init__.py
peut juste être un fichier vide, mais il peut également exécuter l'initialisation code pour le paquet ou ensemble le variables__all__
, décrite plus loin.
Autres conseils
Il a fonctionné pour moi d'insérer les nouveaux dirs que les premières entrées dans 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)