【问题标题】:Google App Engine: ImportError: No module named appengine.extGoogle App Engine:ImportError:没有名为 appengine.ext 的模块
【发布时间】:2016-03-15 21:54:27
【问题描述】:

我正在尝试为使用数据存储的 GAE 程序编写测试。 在Google's Documentation 之后,我看到我应该将我的 SDK 的路径添加到我的 PYTHONPATH 中。 我是这样做的:

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__.pyappengine。基本上,文件夹结构对我来说看起来不错,它们都被正确命名并具有__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?

编辑: 我正在运行最新的 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 似乎仍在从不再存在的路径导入,我猜这将是我的问题的症结所在。我需要重新加载路径吗?

【问题讨论】:

  • import google成功后,print google.__file__的输出是什么?
  • AttributeError: 'module' 对象没有属性 'file'。另一方面, path 给了我'/usr/local/lib/python2.7/dist-packages',虽然我已经删除了。这可能是我问题的根源。虽然当我打印 sys.path 时,它并没有出现在那里...
  • 对我来说,开发服务器远程 shell 中的 print google.__ file __ 会显示我本地文件系统中的路径。我强烈建议您遵循@billprin 的建议并在 virtualenv 中运行您的应用程序,以避免与您机器上的任何内容发生冲突。 FWIW 我的测试运行器在 sys.path 的前面插入到 sdk 的路径,然后调用 dev_appserver.fix_sys_path() 并且效果很好。
  • 最后我只是pip uninstall protobuf,这暂时停止了冲突。目前我不是特别想使用 virtualenv,但会考虑一下。

标签: python python-2.7 google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

通过始终在 virtualenv 中运行,我遇到的这些问题要少得多。

我同意snakecharmerrb 的观点,您应该打印google.__file__google.__path_ 以准确了解您要导入的内容。

这个 sn-p 也可能解决你的问题:

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`

【讨论】:

    【解决方案2】:

    您使用的是哪个版本的应用引擎 SDK?我正在使用最新的 SDK (1.9.34)。我在我的 ~/google_appengine/google/appengine/ext/ndb/google_imports.py 文件中找到了以下 sn-p

    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 试试同样的代码。

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2015-05-06
      • 1970-01-01
      • 2013-03-14
      • 2013-03-24
      • 2015-04-24
      相关资源
      最近更新 更多