Google App Engine: ImportError: No module named appengine.ext
Je suis en train d'écrire un test pour mon GAE programme qui utilise la banque de données.
Suivant Google Documents, je vois que je devrais ajouter le chemin d'accès à mon SDK dans mon PYTHONPATH.
Je l'ai fait à l'aide de:
import sys
sys.path.remove('/usr/local/lib/python2.7/dist-packages') # Has a 'google' module, which I want to be sure isn't interfering.
sys.path.insert(1,'/home/olly/google-cloud-sdk/platform/google_appengine')
sys.path.insert(1, '/home/olly/google-cloud-sdk/platform/google_appengine/lib/yaml/lib')
Puis, quand le fichier est exécuté:
Traceback (most recent call last):
File "myapp_tests.py", line 20, in <module>
from google.appengine.ext import ndb
ImportError: No module named appengine.ext
J'ai installé le SDK dans l'emplacement ci-dessus, et en regardant dans /home/olly/google-cloud-sdk/platform/google_appengine/
j'ai trouvé le google
dossier, qui a un __init__.py
, le long avec appengine
. Fondamentalement, la structure de dossier me semble bon, avec eux tous d'être nommé correctement et avoir __init__.py
fichiers.
Dans une console interactive, après l'exécution de la commande ci-dessus, j'ai découvert que je pouvais courir:
import google
pas de problème, mais quand j'ai essayé
import google.appengine
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named appengine
J'avais cru comprendre que le fait d'avoir le __init__.py()
fichiers dans les répertoires signifiait qu'ils pouvaient être importés en tant que ci-dessus.
J'ai aussi fait un sudo find /--name "google"
, et la seule chose qui a montré jusqu'qui est aussi dans mon PYTHONPATH était le /usr/local/lib/python2.7/dist-packages
, j'ai explicitement supprimées, et également inséré le reste de mon chemin en face de toute façon.
J'ai essayé d'utiliser GAE propre méthode de:
import dev_appserver
dev_appserver.fix_sys_path()
qui a ajouté tout un tas de chemins de sys.chemin d'accès, mais n'a toujours pas m'aider à le faire fonctionner.
J'ai aussi constaté que lorsque j'ajoute '/home/olly/Servers/google_appengine/google'
de mon chemin, je peux courir:
import appengine.ext
mais en cours d'exécution:
from appengine.ext import ndb
causes:
Traceback (most recent call last):
File "booking_function_tests.py", line 16, in <module>
from appengine.ext import ndb
File "/home/olly/Servers/google_appengine/google/appengine/ext/ndb/__init__.py", line 7, in <module>
from tasklets import *
File "/home/olly/Servers/google_appengine/google/appengine/ext/ndb/tasklets.py", line 69, in <module>
from .google_imports import apiproxy_stub_map
File "/home/olly/Servers/google_appengine/google/appengine/ext/ndb/google_imports.py" , line 11, in <module>
from google3.storage.onestore.v3 import entity_pb
ImportError: No module named google3.storage.onestore.v3
Ai-je raté quelque chose d'évident? Comment dois-je aller sur l'importation de ndb?
EDIT:
Je suis l'exécution du dernier SDK (1.9.34), mais j'ai le code suivant dans mon google_imports.py:
try:
from google.appengine.datastore import entity_pb
normal_environment = True
except ImportError:
try:
from google3.storage.onestore.v3 import entity_pb
normal_environment = False
except ImportError:
# If we are running locally but outside the context of App Engine.
try:
set_appengine_imports()
from google.appengine.datastore import entity_pb
normal_environment = True
except ImportError:
raise ImportError('Unable to find the App Engine SDK. '
'Did you remember to set the "GAE" environment '
'variable to be the path to the App Engine SDK?')
Aussi, google.__path__
me donne la '/usr/local/lib/python2.7/dist-packages'
chemin que je pensais, je l'ai enlevé plus tôt. Voici un extrait de comment je vais l'enlever:
import sys
sys.path.insert(1, '/home/olly/Servers/google_appengine')
sys.path.insert(1, '/home/olly/Servers/google_appengine/lib/yaml/lib')
sys.path.remove('/usr/local/lib/python2.7/dist-packages')
import google
print google.__path__
print sys.path
['/usr/local/lib/python2.7/dist-packages/google']
['/home/olly/Servers/google_appengine/myapp', '/home/olly/Servers/google_appengine/lib/yaml/lib', '/home/olly/Servers/google_appengine/google', '/home/olly/Servers/google_appengine', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
Donc mon sys.chemin d'accès est mis à jour, mais import google
semble encore être une importation à partir de la plus-il n'y en chemin, qui serait le cœur de mon problème, je suppose. Ai-je besoin de recharger le chemin d'accès ou quelque chose?
import google
, quel est le résultat de print google.__file__
?AttributeError: 'module' objet n'a pas d'attribut " fichier'. chemin d'autre part, est de me donner le fichier '/usr/local/lib/python2.7/dist-packages', que je mais je l'ai enlevé. C'est probablement la source de mes problèmes. Bien que lorsque j'imprime sys.chemin d'accès, il n'est pas là...
Pour moi,
print google.__ file __
dans le serveur de dev à distance de shell affiche le chemin d'accès à mon système de fichiers local. Je recommanderais fortement suivant @billprin des conseils et de l'exécution de votre application dans un virtualenv pour éviter les conflits avec quoi que ce soit sur votre machine. FWIW mon test runner insère le chemin du sdk à l'avant de sys.chemin d'accès, puis appelle dev_appserver.fix_sys_path() et qui fonctionne bien.En fin de compte je viens de
pip uninstall protobuf
, qui a cessé de le conflit pour l'instant. Je n'ai pas particulièrement envie d'utiliser un virtualenv pour le moment, mais pense à ce sujet.
OriginalL'auteur Olly F-G | 2016-03-15
Vous devez vous connecter pour publier un commentaire.
Je rencontre ces problèmes, beaucoup moins par toujours en cours d'exécution à l'intérieur d'un virtualenv.
Je suis d'accord avec snakecharmerrb, vous devriez obtenir l'impression
google.__file__
ougoogle.__path_
à comprendre exactement ce que vous importez.Cet extrait pourrait également résoudre votre problème:
OriginalL'auteur Bill Prin
La version de app engine SDK utilisez-vous? Je suis avec le dernier SDK (1.9.34). Je trouve l'extrait de code ci-dessous dans mon ~/google_appengine/google/appengine/ext/ndb/google_imports.py fichier
Mais dans la trace de la pile, après google3.stockage à l'importation, il ne semble pas aller à l'intérieur de la à l'exception de la clause.
Essayez donc le même code avec la dernière version du SDK.
OriginalL'auteur Sriram