Python Azure Function: Failure Exception: ModuleNotFoundError: No module named '__main__'

Python Azure Function: Failure Exception: ModuleNotFoundError: No module named '__main__'

我正在触发一个 Azure 函数,它获取一些数据并将其写入 SQL 数据库。文件功能在本地完美运行,但是当我将它部署到 Azure 时,我不断收到以下错误:

Result: Failure Exception: ModuleNotFoundError: No module named '__main__'. Troubleshooting 
Guide: https://aka.ms/functions-modulenotfound Stack: File "/azure-functions- 
host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 301, in 
 _handle__function_load_request func = loader.load_function( File "/azure-functions- 
host/workers/python/3.9/LINUX/X64/azure_functions_worker/utils/wrappers.py", line 42, in call 
raise extend_exception_message(e, message) File "/azure-functions- 
host/workers/python/3.9/LINUX/X64/azure_functions_worker/utils/wrappers.py", line 40, in call 
return func(*args, **kwargs) File "/azure-functions- 
host/workers/python/3.9/LINUX/X64/azure_functions_worker/loader.py", line 83, in load_function 
mod = importlib.import_module(fullmodname) File 
"/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module return 
_bootstrap._gcd_import(name[level:], package, level) File 
"/home/site/wwwroot/jobinfo/__init__.py", line 7, in <module> from .auth_and_get import * File 
"/home/site/wwwroot/jobinfo/auth_and_get.py", line 9, in <module> load_dotenv() File 
"/home/site/wwwroot/.python_packages/lib/site-packages/dotenv/main.py", line 317, in 
load_dotenv f = dotenv_path or stream or find_dotenv() File 
"/home/site/wwwroot/.python_packages/lib/site-packages/dotenv/main.py", line 265, in 
find_dotenv if usecwd or _is_interactive() or getattr(sys, 'frozen', False): File 
"/home/site/wwwroot/.python_packages/lib/site-packages/dotenv/main.py", line 262, in 
 _is_interactive main = __import__('__main__', None, None, fromlist=['__file__'])

在我的函数文件中 __init__.py 我导入了一个模块 auth_and_get.py ,我在其中创建了方法,我想在我的 Azure 函数中调用它,我认为我的导入有问题,但是我试过修复它,但没有成功。

我当前的 __init__.py 文件是

from __future__ import absolute_import

import datetime
import logging

import azure.functions as func
from .auth_and_get import *


def main(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if mytimer.past_due:
        logging.info('The timer is past due!')

    authenticate()
    users()
    to_db()

    logging.info('Python timer trigger function ran at %s', utc_timestamp)

我怀疑是以下语句失败了:from .auth_and_get import *。我试过删除点 from auth_and_get import *,但随后模块变得无法解析。

结构为

ProjectFolder/
| - .venv
| - .vscode
|jobinfo/
| | - __pycache__
| | - __init__.py
| | - auth_and_get.py
| | - function.json
| | - sample.dat
| - .funcignore
| - host.json
| - local.settings.json
| - proxies.json
| - requirements.txt

问题

您是否在 Azure 门户上为您的应用服务设置了启动命令? 我的意思是设置 - >配置 - >常规设置,然后在“启动命令”字段中你应该有这样的东西:

gunicorn --bind=0.0.0.0 --timeout 600 --chdir jobinfo __init__:<app object>

当然你可以设置其他命令(比如非Gunicorn),但这是一个基于Azure docs的例子。

Azure 默认查找名为 app.pyapplication.py.

的主模块

这里解释一下:https://docs.microsoft.com/en-us/azure/app-service/configure-language-python#customize-startup-command

ModuleNotFoundError: No module named '__main__' 表示 Azure 查找名为 __main__ 的模块而不是 __init__.

所以经过各种尝试,我找到了解决方案,添加

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__))))

__init__.py 文件。