在Azure Functions中共享Python项目包
我正在尝试在我的Python项目中重用一些代码,这个项目是在Azure Function上,结构如下:
myproject/
| - a_app/
| - b_app/
| - c_lib/
| - requirements.txt
到目前为止,我一直在方便地避免在我的两个独立模块a_app和b_app之间共享代码。但现在我想创建一些可以共享的类,并把它们放在c_lib里。
这里有一个Azure函数:
myproject/
| - a_app/FunctionA/init.py
它通过以下语句引用了c_lib库: from c_lib.foundation_utility.jwt_enforced_permissions import JWTEnforcedPermissions
所有的测试在本地都通过了,引用也成功导入了,但当我部署到Azure Function时,它就是找不到这个库(我想共享的一个类):
文件 "/home/site/wwwroot/FunctionA/init.py",第10行,来自 c_lib.foundation_utility.jwt_enforced_permissions 的导入 JWTEnforcedPermissions 文件 "/home/site/wwwroot/c_lib/foundation_utility/jwt_enforced_permissions.py",第4行,来自 foundation_utility.i_token_permissions 的导入 ITokenPermissions
我真搞不懂为什么它找不到这个库。我正在尝试浏览Azure Function的文件夹结构,以便找出文件实际位于哪里,从而弄清楚为什么它不工作。
考虑到我能够在a_app和b_app中成功引用各种类,但它们之间不能相互引用,我知道如何成功调用正确的命名空间。因此,我考虑将c_lib复制到a_app和b_app的文件夹中,作为GitHub构建操作的一部分:
- name: Copy c_lib into Function App Directory
run: |
cp -r c_lib a_app/
然而,尽管这样做了,并尝试从a_app中引用c_lib,但仍然不行。 我也考虑过将这个库创建为一个pip模块,但这不是我想要的,因为我想以与a_app和b_app相同的版本部署这个库。我不想要版本不一致。
某种原因使得Azure Function无法访问其自身包之外的代码。
1 个回答
请参考我的SO回答1,我在里面展示了如何从另一个文件夹导入类到init.py
。如果你在c_lib文件夹里有自定义的Python库,可以通过在requirements.txt文件中添加文件夹路径来导入这些库。关于这个问题,你可以参考我的SO回答2。
为了帮助你解决错误,请按照以下步骤操作:
我的函数文件夹:-
我的init.py
文件中添加了这段代码,使用了sys.path.append
,这样可以正确导入c_lib
文件到两个应用中:
import logging
import azure.functions as func
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'c_lib'))
# Now you can import your shared classes
from c_lib.foundation_utility.jwt_enforced_permissions import JWTEnforcedPermissions
输出结果:-