gpt4 book ai didi

python - Azure函数不执行其他Python函数

转载 作者:行者123 更新时间:2023-12-03 00:23:14 25 4
gpt4 key购买 nike

我在 main.py 中有以下代码,这是我的项目的简化版本,我在其中检索一些数据、清理数据并将其导出到 Azure 中的 SQL 数据库。

问题是,当我使用 Azure 函数在本地运行它时,一切正常,并且我可以在终端中看到日志记录。

但是当我使用 azure start --verbose 运行它时,该函数正确启动,但执行我的函数 export_data 不起作用。

简化代码:

# import packages
# load_dotenv()

def get_data():
# function which retrieves data


def export_data():
# function which exports data and uses environment variables


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

if timer.past_due:
logging.info('The timer is past due! Writing data to database')
export_data()

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


if __name__ == "__main__":
export_data()

我的代码:

import os
import datetime
import logging
import pandas as pd
from sqlalchemy import create_engine
from dotenv import load_dotenv
import azure.functions as func
load_dotenv()


logging.basicConfig(
format="%(asctime)s.%(msecs)03d [%(levelname)-5s] [%(name)s] - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
level=logging.INFO,
)


def get_data():
# get data
logging.info("retrieving data")
url = "https://data.rivm.nl/covid-19/COVID-19_aantallen_gemeente_per_dag.csv"
df = pd.read_csv(url, sep=";")

return df


def export_data():
# export data
df = get_data()

uid = os.environ.get("username")
password = os.environ.get("pw")
server = '***.database.windows.net'
database = os.environ.get("database")
driver = "ODBC Driver 17 for SQL Server"

connection_string = (
f"mssql+pyodbc://{uid}:{password}@" f"{server}:1433/{database}?driver={driver}"
)

engine = create_engine(connection_string)
con = engine.connect()

logging.info("exporting data")
df.head(10).to_sql('covid_19', con=con, if_exists='replace')


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

if timer.past_due:
logging.info('The timer is past due! Writing data to database')
export_data()

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


if __name__ == "__main__":
export_data()

function.json:

{
"scriptFile": "main.py",
"bindings": [
{
"name": "timer",
"type": "timerTrigger",
"direction": "in",
"schedule": "0 */5 * * * *"
}
]
}
<小时/>

编辑

这是日志的一部分,显示了当我最初使用 func start --verbose 调用函数时函数运行的情况。注意时间,它不会在整个 5 分钟内发生,因为我的日程安排是基于此 ("schedule": "0 */5 * * * *"):

[2020-10-23T09:23:43.339] The timer is past due! Writing data to database
[2020-10-23T09:23:43.340] retrieving data
[2020-10-23T09:23:45.323] exporting data
[2020-10-23T09:23:46.182] Python timer trigger function ran at 2020-10-23T09:23:43.332697+00:00

然后在这部分之后,函数将根据计时器触发运行,但什么也没有发生:

[2020-10-23T09:25:00.009] Executing 'Functions.zyppcovid' (Reason='Timer fired at 2020-10-23T11:25:00.0076610+02:00', Id=***)
[2020-10-23T09:25:00.012] Received FunctionInvocationRequest, request ID: ***, function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.013] Function is sync, request ID: ***,function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.013] Python timer trigger function ran at 2020-10-23T09:25:00.012563+00:00
[2020-10-23T09:25:00.013] Successfully processed FunctionInvocationRequest, request ID: ***, function ID: ***, invocation ID: ***
[2020-10-23T09:25:00.014] Executed 'Functions.zyppcovid' (Succeeded, Id=***, Duration=6ms)

最佳答案

代码已经有一个用于定时器触发的主函数def main(timer: func.TimerRequest) -> None:。所以它不能执行另一个 main if __name__ == "__main__":。我在我这边测试了一下,如果我只是用main创建一个简单的python代码,它可以在main函数成功下执行export_data()

关于python - Azure函数不执行其他Python函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64491858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com