在Azure Functions中不能有Python外部代码吗?
我正在开发一个Azure函数应用,里面定义了多个Azure函数作为蓝图。
我想做的是创建一些函数,这些函数可以在同一个文件中被Azure函数蓝图调用(下面有个例子)。
在云端出问题:
import logging
import azure.functions as func
bp = func.Blueprint()
@bp.timer_trigger(
schedule="0 0 10 * * *",
arg_name="myTimer",
run_on_startup=False,
use_monitor=False,
)
def my_azure_function(myTimer: func.TimerRequest) -> None:
do_something()
# This breaks the Function App in the cloud, not locally.
def do_something():
logging.info("test log")
在本地用调试器运行时,这一切都很正常,但一旦部署到Azure上,这个函数就不会出现在函数应用的概览里。
奇怪的是,如果把这个函数删掉,然后把代码直接放在Azure函数蓝图里面,部署后就能正常工作(下面有个例子)。
在云端不出问题:
import logging
import azure.functions as func
bp = func.Blueprint()
@bp.timer_trigger(
schedule="0 0 10 * * *",
arg_name="myTimer",
run_on_startup=False,
use_monitor=False,
)
def my_azure_function(myTimer: func.TimerRequest) -> None:
# This was done by a function before
logging.info("test log")
这让我很烦恼,因为这个Azure函数需要完成很多事情。我觉得把代码拆分成多个函数,然后让Azure函数蓝图调用这些函数,是最好的解决办法。
我已经做了一些研究,但没能找到解决这个问题的方法。我查看了StackOverflow上的问题,也读了大部分Azure函数的文档。
希望有人能告诉我该怎么修复这个问题,或者我哪里做错了。
编辑:
我做了一些测试,发现当我导入“requests”模块时,这些函数在云端就消失了。我想知道有没有地方可以查看原因?
2 个回答
0
我通过查看文档发现,Azure生成的工作流程中,包安装得不对。
这个工作流程是通过运行以下命令来下载依赖项的:
pip install -r requirements.txt
但是这个命令并没有把包安装到正确的位置。实际上应该运行这个命令:
pip install --target="./.python_packages/lib/site-packages" -r requirements.txt
这样部署就正确了,模块也能正确安装。
0
但是当它被部署到Azure时,这个功能在Function App的概览中没有显示出来。
蓝图不能作为功能部署到Azure Function。
你需要在主文件中导入蓝图。在Azure Function中,只有当使用 func.FunctionApp()
调用功能时,它才会被识别。
可以参考这个文档。
我的目录:
blueprint.py
:
import azure.functions as func
import logging
bp = func.Blueprint()
@bp.timer_trigger(arg_name="mytimer", schedule="0 */5 * * * *", run_on_startup=False, use_monitor=False)
def my_azure_func(mytimer:func.TimerRequest):
do_something()
def do_something():
logging.info("test log")
function_app.py
:
import azure.functions as func
import logging
from blueprint import bp
app= func.FunctionApp()
app.register_functions(bp)