首页 > 解决方案 > ImportError:没有名为 [目录] Google App Engine 的模块

问题描述

我不断收到一条错误消息,提示 no module named backend,这是我的 webapp2 应用程序所在的目录。

我的文件夹结构:

/project
 /backend
   /env    #python virtual env libraries
   main.py #my main entry point where webapp2 app instance is
   requirements.txt
 app.yaml

我的 app.yaml:

service: default

handlers:
- url: /dist
  static_dir: dist

- url: /.*
  script: backend.main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

在我app.yaml进入后端之前,但我决定移至 root。现在,当我dev_appserver.py以 root 运行时,我不断得到ImportError: No module named backend

我创建了 virualenv 并在backend目录中安装了 requirements.txt 包。

编辑:我不确定这是否会有所不同,但我已经在文件夹app.yaml内部署了我的应用程序backend。我猜这应该没关系,因为我试图通过app.yaml在我的项目根目录中移动并运行来进行本地测试dev_appserver.py app.yaml,但是当我这样做时它似乎不起作用。

标签: python-2.7google-app-engineyaml

解决方案


包含app.yamlGAE 服务文件的目录是该服务的顶级目录。此目录的内容是部署服务时将上传到 GAE 的内容。服务代码或配置中引用的所有路径都与此顶级目录相关。因此,app.yaml在不相应更新相关代码和配置的情况下移动文件将破坏应用程序的功能。

您似乎没有很好地理解该script:语句的含义。从处理程序元素

指令必须script:是 python 导入路径,例如, package.module.app指向 WSGI 应用程序。使用 Python 模块路径的指令的最后一个组成部分是script:模块中全局变量的名称:该变量必须是 WSGI 应用程序,并且通常app按约定调用。

注意:就像 Python 的导入语句一样,作为包的每个子目录都必须包含一个名为__init__.py

因此,假设您的app.yaml文件位于您的project目录中,则

script: backend.pythonAttack.app

将意味着:

  • 在目录中有一个__init__.py文件backend,以制作backend一个包
  • 在目录中有一个pythonAttack.py文件backend,其中一个app变量指向您的 webapp2 应用程序

根据您的描述,您不符合上述任何条件。

我的建议:

  • 保留目录app.yaml内部backend(不需要是python包目录)
  • 更新其script行以匹配您的代码。假设app您的应用程序的变量webapp2实际上在main.py文件中,该行将是:

      script: main.app
    
  • 通过显式传递文件作为参数在本地运行应用程序app.yaml(通常是一个好习惯,也是运行具有多个服务和/或dispatch.yaml文件的应用程序的唯一方法):

    dev_appserver.py backend/app.yaml
    
  • 将你的服务 python 依赖项存储在一个backend/lib目录中(遵循命名约定),与你的 virtualenv 包分开

  • envvirtualenv 包目录存储在目录之外,backend以防止在部署服务时将它们不必要地上传到 GAE(以及对应用程序操作的潜在干扰)。virtualenv 的目标是在本地正确模拟 GAE 沙箱,以便您可以正确运行开发服务器。

对构建多服务应用程序可能感兴趣:就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?


推荐阅读