[英]ModuleNotFoundError: No module named 'x' while importing modules
[英]ModuleNotFoundError while importing python files as modules in Azure App Services
我开始使用 Azure 应用服务。
我按照本教程进行操作,并且能够运行示例main.py应用程序。
requirements.txt中指定的模块( fastapi
、 uvicorn
等)均已正确安装和导入。
但是,当尝试导入与 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.