Azure Functions(Linux Python3.9)部署后rlp缺失Serializable属性报错
问题成因
部署环境中rlp模块属性缺失的核心原因有两类,90%以上场景为第一种:
- 模块命名冲突:项目目录下存在名为
rlp.py的文件、或名为rlp的代码文件夹,Python导入模块时优先加载工作目录下的本地代码,覆盖了pip安装的官方rlp第三方包。从部署后打印的dir(rlp)结果中存在rlp属性可以直接判断——官方2.0.1版本的rlp顶层模块不存在该属性,这是本地同名嵌套模块的典型特征。本地Windows环境运行正常通常是因为本地启动时工作目录优先级不同,未加载到本地同名冲突文件,部署后Azure Functions默认将项目根目录放在模块搜索路径最高优先级,直接触发冲突。 - 依赖安装异常:Linux版Azure Functions默认开启部署缓存,若未开启服务端构建配置,可能出现依赖未按
requirements.txt指定版本安装、Windows平台预编译依赖在Linux环境不兼容、旧版本错误依赖残留的问题,导致加载的rlp不是目标2.0.1版本。
解决方案
按以下顺序排查修复即可:
- 排查命名冲突
检查本地Functions项目的所有目录,删除/重命名所有名为rlp.py的文件、名为rlp的自定义代码文件夹,绝对避免自定义代码和第三方依赖包重名。 - 开启服务端依赖构建配置
在Azure函数应用的「配置-应用程序设置」中添加键值:SCM_DO_BUILD_DURING_DEPLOYMENT = true
配置后部署时服务端会自动基于Linux Python 3.9环境安装requirements.txt中指定的依赖,避免本地Windows环境打包的依赖不兼容问题。 - 清理旧依赖缓存
进入函数应用绑定的存储账户,删除以下路径的所有缓存文件:data/SitePackages目录下所有内容/home/site/wwwroot/.python_packages目录下所有内容
清理完成后重新执行部署,不要本地提前安装依赖后上传,直接上传源码和requirements.txt即可。
- 部署后验证
部署完成后可临时添加调试代码确认rlp加载正确:
若打印的路径指向import rlp # 打印rlp实际加载路径,正确路径应包含site-packages/rlp print(rlp.__file__) # 确认Serializable属性存在 print(hasattr(rlp, 'Serializable'))/home/site/wwwroot/下的自定义rlp文件/文件夹,回到第一步重新排查命名冲突即可。
内容的提问来源于stack exchange,提问作者kanna
相关产品推荐
相关产品推荐

