2

Я пытаюсь написать тест для моей программы GAE, которая использует хранилище данных. Следуя Google's Documentation, я вижу, что я должен добавить путь к моему SDK в свой PYTHONPATH. Я сделал это с помощью:Google App Engine: ImportError: нет модуля с именем appengine.ext

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') 

Затем, когда файл запуска:

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 

Я установил SDK в вышеуказанном месте, и, глядя в /home/olly/google-cloud-sdk/platform/google_appengine/ я нашел google папку, которая имеет __init__.py в нем, а также appengine. В принципе, структура папок выглядит хорошо для меня, и все они правильно названы и имеют файлы __init__.py.

В интерактивной консоли, после выполнения команды выше, я обнаружил, что я не мог бежать:

import google 

не проблема, но когда я попытался

import google.appengine 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named appengine 

Это было мое понимание, что наличие __init__.py() Файлы в каталогах означали, что они могут быть импортированы, как указано выше. Я также сделал sudo find/--name "google", и единственное, что появилось в моем PYTHONPATH, было /usr/local/lib/python2.7/dist-packages, которое я явно удалил, а также вставил остальные мои пути в любом случае.

Я попытался с помощью собственного метода GAE по:

import dev_appserver 
dev_appserver.fix_sys_path() 

прибавило целый много путей к sys.path, но все еще не помогло мне сделать его работу.

Я также обнаружил, что, когда я добавить '/home/olly/Servers/google_appengine/google' мои пути, я могу запустить:

import appengine.ext 

но работает:

from appengine.ext import ndb 

причины:

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 

Я пропускаю что-то действительно очевидно? Как мне нужно импортировать ndb?

EDIT: Я бегу последнюю версию SDK (1.9.34), но у меня есть следующий код в моем 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?') 

Кроме того, google.__path__ дает мне '/usr/local/lib/python2.7/dist-packages' путь, который я думал Я удалил раньше. Вот отрывок о том, как я его удаления:

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'] 

Так что мой sys.path обновляется, но import google, кажется, по-прежнему импорта из переставшего быть-там путь, который был бы суть моего проблема думаю. Нужно ли мне перегружать путь или что-то еще?

+1

После успешного «импорта google», какой результат «print google .__ file__'? – snakecharmerb

+0

AttributeError: объект 'module' не имеет атрибута '__file__'. __path__, с другой стороны, дает мне «/usr/local/lib/python2.7/dist-packages», который я, хотя я удалил. Вероятно, это источник моих проблем. Хотя, когда я печатаю sys.path, он не отображается там ... –

+0

Для меня 'print google .__ file __' в удаленной оболочке сервера dev отображает путь в моей локальной файловой системе. Я настоятельно рекомендую вам следовать рекомендациям @ billprin и запускать приложение в виртуальном пространстве, чтобы избежать конфликтов с чем-либо на вашем компьютере. FWIW мой тестовый бегун вставляет путь к sdk в начале sys.path, а затем вызывает dev_appserver.fix_sys_path(), и это хорошо работает. – snakecharmerb

ответ

5

Я столкнулся с этими проблемами намного меньше, всегда работая внутри virtualenv.

Я согласен с snakecharmerrb, вы должны получить распечатку google.__file__ или google.__path_, чтобы выяснить, что именно вы импортируете.

Этот фрагмент также может решить вашу проблему:

import google 

gae_dir = google.__path__.append('/path/to/appengine_sdk//google_appengine/google') 
sys.path.insert(0, gae_dir) # might not be necessary 

import google.appengine # now it's on your import path` 
1

Какую версию SDK App Engine вы используете? Я использую последнюю версию SDK (1.9.34). Я считаю ниже фрагмент кода в моем ~/google_appengine/Google/AppEngine/внутр/NDB/google_imports.py файла

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?') 

Но в вашей трассировке стеки, после импорта google3.storage это, кажется, не идет внутри предложения except.

Итак, попробуйте тот же код с последним SDK.