ImportError:没有名为[directory] ​​Google App Engine的模块

时间:2018-12-25 08:29:46

标签: python-2.7 google-app-engine yaml

我不断收到一条错误消息,提示没有名为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。现在,当我以root身份运行dev_appserver.py时,我会不断得到ImportError: No module named backend

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

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

1 个答案:

答案 0 :(得分:2)

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

您似乎不太了解script:语句的含义。来自Handlers element

  

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软件包分开

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

构建多服务应用时可能会感兴趣:Can a default service/module in a Google App Engine app be a sibling of a non-default one in terms of folder structure?