繁体   English   中英

将 python 文件作为模块导入 Azure 应用服务中时出现 ModuleNotFoundError

[英]ModuleNotFoundError while importing python files as modules in Azure App Services

我开始使用 Azure 应用服务。

我按照本教程进行操作,并且能够运行示例main.py应用程序。

requirements.txt中指定的模块( fastapiuvicorn等)均已正确安装和导入。

但是,当尝试导入与 main.py 位于同一目录中的Python文件时,部署仍然成功,但尝试通过网页浏览时出现应用程序错误: 在此处输入图像描述

例如,我创建了一个名为settings.py的文件,其中包含:

MY_TITLE = "My FastAPI prototype"

在这个main.py中,我简单地修改了:

app = FastAPI()

和:

import settings
app = FastAPI(title=f"{settings.MY_TITLE}")

但这失败了! 请注意,当我在主脚本中指定MY_TITLE时,我能够正确更新页面的标题。

如何从 Azure 应用服务上的main.py脚本导入 Python 文件?

ModuleNotFoundError无法解析模块的名称时,会发生 ModuleNotFoundError。 如果模块名称既不在sys.modules也不在标准库中找到,Python 将尝试在sys.path中解析它(参见模块搜索路径)。 如果找不到命名模块,则会引发ModuleNotFoundError

要克服此错误,您必须将模块的父目录(Python 文件)添加到系统PATH变量中,或者使用此答案此答案中描述的相对导入。 相对导入的优点之一是它们非常简洁。 要指定相对导入的位置,请使用点表示法。 例如:

from .settings import MY_TITLE

或者,要导入每个 function 和settings package 中包含的属性,请使用*通配符(但是,使用*时要小心):

from .settings import *

单个点表示引用的模块与当前位置位于同一目录中。 两个点表示它位于当前位置的父目录中,依此类推。

我还应该提到,相对导入可能会很混乱,特别是对于目录结构可能会改变的共享项目,并且不像绝对导入那样可读。 因此, PEP 8 风格指南一般建议使用绝对导入:

建议使用绝对导入,因为如果导入系统配置不正确(例如 package 中的目录最终位于sys.path上),它们通常更具可读性并且表现得更好(或至少提供更好的错误消息)

但是,有时绝对导入会变得非常冗长,具体取决于目录结构的复杂性。

从我们的评论讨论中添加答案

我建议您在您的 web 应用程序上启用诊断日志记录,并尝试查看(诊断和解决问题--> 可用性和性能)下的应用程序日志,以确定导致此问题的原因。

正如您在评论中提到的那样,您看到 Module not found 错误。 一般来说, ModuleNotFoundError:表示 Python 在应用程序启动时找不到您的一个或多个模块。 如果您使用代码部署虚拟环境,这通常会发生。 虚拟环境不可移植,因此不应使用您的应用程序代码部署虚拟环境。

您可以参考此文档以进一步排除Module not found 错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM