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
问题
- 为什么我会收到
Failure Exception: ModuleNotFoundError: No module named '__main__'
错误?
您是否在 Azure 门户上为您的应用服务设置了启动命令?
我的意思是设置 - >配置 - >常规设置,然后在“启动命令”字段中你应该有这样的东西:
gunicorn --bind=0.0.0.0 --timeout 600 --chdir jobinfo __init__:<app object>
当然你可以设置其他命令(比如非Gunicorn),但这是一个基于Azure docs的例子。
Azure 默认查找名为 app.py
或 application.py
.
的主模块
ModuleNotFoundError: No module named '__main__'
表示 Azure 查找名为 __main__
的模块而不是 __init__
.
所以经过各种尝试,我找到了解决方案,添加
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__))))
到 __init__.py
文件。
我正在触发一个 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
问题
- 为什么我会收到
Failure Exception: ModuleNotFoundError: No module named '__main__'
错误?
您是否在 Azure 门户上为您的应用服务设置了启动命令? 我的意思是设置 - >配置 - >常规设置,然后在“启动命令”字段中你应该有这样的东西:
gunicorn --bind=0.0.0.0 --timeout 600 --chdir jobinfo __init__:<app object>
当然你可以设置其他命令(比如非Gunicorn),但这是一个基于Azure docs的例子。
Azure 默认查找名为 app.py
或 application.py
.
ModuleNotFoundError: No module named '__main__'
表示 Azure 查找名为 __main__
的模块而不是 __init__
.
所以经过各种尝试,我找到了解决方案,添加
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__))))
到 __init__.py
文件。