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?

Après le succès de la 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