Azure Functions Python调用私有仓库代码报ModuleNotFoundError如何解决
解决方案
你的报错核心是两个原因:
- Python运行时默认的模块搜索路径未包含项目根目录和src目录,无法找到对应包
- 你使用了可编辑模式(-e)安装私有包,生成的egg-link路径是Github Runner本地的路径,部署到Azure环境后路径失效,无法指向正确的包位置
方案1:临时修改模块搜索路径(无需改配置,改代码即可)
在HttpTrigger/__init__.py的所有import语句前,加入以下代码,手动把项目根目录和src目录加入搜索路径:
import sys import os # 获取当前文件所在目录(即HttpTrigger目录)的父目录,也就是项目根目录 project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) src_path = os.path.join(project_root, "src") # 把两个路径加入模块搜索列表 sys.path.append(project_root) sys.path.append(src_path)
添加完成后,直接用绝对导入即可:
from private_git_repo.package.function import 目标函数名
注意:不要使用带..的相对导入写法,Azure Function触发器脚本作为入口执行时,相对导入会触发语法错误
方案2:优化私有包安装方式(无需改代码,一劳永逸)
你当前生成egg-link的原因是requirements.txt里的私有仓库依赖用了-e可编辑安装模式,把requirements.txt里私有仓库的依赖写法修改,去掉-e参数即可,示例写法:
git+https://<你的私有仓库访问凭证>@github.com/你的用户名/私有仓库名.git@版本号#egg=private_git_repo
修改后重新执行安装命令:pip install -r requirements.txt --target=".python_packages/lib/site-packages"
此时私有包会直接安装到.python_packages/lib/site-packages目录下,不会生成egg-link,部署后直接用import private_git_repo的写法就能正常导包。
方案3:修改Azure Function环境变量(无需改代码和依赖配置)
在Azure Portal的Function应用配置页,添加名为PYTHONPATH的环境变量,值设置为:/home/site/wwwroot:/home/site/wwwroot/src
保存后重启函数,Azure运行时会自动在以上路径搜索模块,直接用绝对导入即可正常使用。
排查注意事项
- 确认
src/private_git_repo、src/private_git_repo/package目录下都存在空的__init__.py文件,保证目录被识别为Python包 - 检查Github Actions的部署配置,确认没有配置排除
src目录的打包规则,保证src目录会被一起部署到Azure环境
内容的提问来源于stack exchange,提问作者YusufD
相关产品推荐
相关产品推荐

