Azure HTTP Trigger函数导入同级src目录模块时出现加载错误求助
问题场景
我们使用Azure Functions构建HTTP Trigger函数,基础代码如下:
import logging import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') name = req.params.get('name') if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get('name') if name: return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.") else: return func.HttpResponse( "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.", status_code=200 )
该函数在线上平台可正常触发,但尝试导入与HttpTrigger1同级的src目录下模块(如import src.main)时,出现如下错误:
Error in load_function. Sys Path:
['C:\Users\AliMehdy\AppData\Roaming\npm\node_modules\azure-functions-core-tools\bin\workers\python\3.10\WINDOWS\X64',
错误指向main.py中加载的load_toml库,且src目录内所有导入语句都会触发同类错误。已查阅微软官方文档关于导入行为的说明(提到绝对导入时shared_code目录需包含__init__.py标记为Python包),但仍未解决问题。
解决步骤
1. 规范项目目录结构
首先确保项目结构符合Azure Functions的Python包规范,示例结构如下:
YourFunctionApp/ ├── HttpTrigger1/ │ ├── __init__.py │ └── function.json ├── src/ │ ├── __init__.py # 必须添加此文件,标记src为Python包 │ └── main.py └── requirements.txt
src目录必须包含空的__init__.py文件,否则Python无法将其识别为可导入的包。
2. 选择合适的导入方式
方式一:相对导入
在HttpTrigger1/__init__.py中使用相对导入语法,直接引用同级的src包:
from ..src import main
注意:相对导入仅适用于包内结构,确保函数应用整体被当作Python包处理。
方式二:手动添加项目根目录到搜索路径
如果相对导入不生效,可在函数的__init__.py开头添加代码,将项目根目录加入Python的sys.path:
import sys import os # 将当前函数目录的父目录(项目根目录)添加到搜索路径 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # 之后即可正常导入src模块 import src.main
这段代码会动态修正Python的模块搜索路径,确保能找到src包。
3. 保证本地调试与部署的一致性
- 本地使用Azure Functions Core Tools调试时,必须在项目根目录执行启动命令,避免路径上下文错误。
- 部署到Azure时,只要目录结构正确且
__init__.py存在,函数运行时会自动识别项目根目录的包结构,无需额外调整路径。
4. 排查依赖问题
如果错误涉及load_toml,检查requirements.txt是否包含相关依赖:
azure-functions>=1.17.0 toml>=0.10.2
执行pip install -r requirements.txt安装依赖后再测试。
内容的提问来源于stack exchange,提问作者alim1990

