Я пытаюсь написать тест для моей программы 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
, кажется, по-прежнему импорта из переставшего быть-там путь, который был бы суть моего проблема думаю. Нужно ли мне перегружать путь или что-то еще?
После успешного «импорта google», какой результат «print google .__ file__'? – snakecharmerb
AttributeError: объект 'module' не имеет атрибута '__file__'. __path__, с другой стороны, дает мне «/usr/local/lib/python2.7/dist-packages», который я, хотя я удалил. Вероятно, это источник моих проблем. Хотя, когда я печатаю sys.path, он не отображается там ... –
Для меня 'print google .__ file __' в удаленной оболочке сервера dev отображает путь в моей локальной файловой системе. Я настоятельно рекомендую вам следовать рекомендациям @ billprin и запускать приложение в виртуальном пространстве, чтобы избежать конфликтов с чем-либо на вашем компьютере. FWIW мой тестовый бегун вставляет путь к sdk в начале sys.path, а затем вызывает dev_appserver.fix_sys_path(), и это хорошо работает. – snakecharmerb