Python Azure Function应用自定义包ModuleNotFoundError问题求助
问题背景
开发Python Azure Function应用时引入了自定义包,按官方文档在CI/CD流水线中构建并安装所有依赖,打包成zip部署到Azure后,运行时触发以下错误:
Result: Failure Exception: ModuleNotFoundError: No module named '{custom package name}'. Cannot find module. Please check the requirements.txt file for the missing module.
检查构建产物发现,官方文档要求的包元数据目录格式为<package-name>-<version>-dist-info,但实际生成的是<package-name>-<version>.dist-info。尝试配置BUILD_FLAGS=UseExpressBuild、PYTHON_ISOLATE_WORKER_DEPENDENCIES=0、SCM_DO_BUILD_DURING_DEPLOYMENT=true、ENABLE_ORYX_BUILD=true这些应用参数后,问题仍未解决。
解决方案
1. 修正自定义包的打包格式
Azure Functions Python运行环境对包的元数据目录结构有明确要求,-dist-info是正确的后缀格式(而非.dist-info)。调整打包流程:
- 确保打包用的
setuptools版本不低于60.0.0,新版本会生成符合要求的-dist-info目录结构,可在setup.py或pyproject.toml中指定依赖版本。 - 优先用
python setup.py sdist生成源码包进行安装,若使用wheel包,需确认其结构符合Azure的要求(避免生成.dist-info)。
2. 调整CI/CD的依赖安装路径
在CI/CD流水线中安装自定义包时,直接指定安装到Azure Functions识别的依赖目录:
pip install ./path/to/your-custom-package.tar.gz -t ./python/lib/site-packages
这样安装后的包文件和元数据目录会被部署时正确识别,避免路径问题导致的模块找不到。
3. 优化部署配置参数
之前的参数组合可能存在冲突,调整为以下配置:
- 设置
SCM_DO_BUILD_DURING_DEPLOYMENT=false:既然已经在CI/CD中完成构建,关闭部署时的自动构建,避免重复构建破坏依赖结构。 - 保留
PYTHON_ISOLATE_WORKER_DEPENDENCIES=0:确保函数工作进程能访问安装的依赖包。 - 移除
BUILD_FLAGS=UseExpressBuild和ENABLE_ORYX_BUILD=true:Express Build和Oryx自动构建在自定义包场景下可能无法正确处理本地依赖,手动构建更可靠。
4. 验证构建产物
部署前检查zip包内的结构:
- 确认自定义包的代码文件在
python/lib/site-packages/<package-name>目录下。 - 确认对应的
<package-name>-<version>-dist-info目录存在于同一层级,格式完全符合要求。
内容的提问来源于stack exchange,提问作者Milad Karimifard

