在Azure Functions中共享Python项目包

0 投票
1 回答
49 浏览
提问于 2025-04-14 17:08

我正在尝试在我的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 个回答

0

请参考我的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

输出结果:-

enter image description here

enter image description here

enter image description here

撰写回答