python-2.7 - 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
,但是当我这样做时它似乎不起作用。
解决方案
包含app.yaml
GAE 服务文件的目录是该服务的顶级目录。此目录的内容是部署服务时将上传到 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 包分开- 将
env
virtualenv 包目录存储在目录之外,backend
以防止在部署服务时将它们不必要地上传到 GAE(以及对应用程序操作的潜在干扰)。virtualenv 的目标是在本地正确模拟 GAE 沙箱,以便您可以正确运行开发服务器。
对构建多服务应用程序可能感兴趣:就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?
推荐阅读
- php - 我想使用 codeigniter 将我的网站语言更改为阿拉伯语
- c++ - 将 cv::Mat 转换为 std::vector
并发症 - php - 为什么 php 中不允许使用 \empty 和 \isset
- javascript - Maphilight() 在放大/缩小图像地图后停止正常工作
- php - 将数据从 CSV 插入数据库 codeigniter
- javascript - 用javascript打印页面时显示文本框
- mysql - 总和值的总和值
- java - 如何使用 spring boot 和 aspect 记录请求正文
- php - 如何将 if/else if 转换为循环
- database - 可以拆分数据库中的值和参数吗