[英]Azure function does not execute other Python functions
我在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()
函數.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:
。 所以if __name__ == "__main__":
它就不能再做另一個 main 。 我在我身邊測試,如果我只是用main創建一個簡單的python代碼,它可以在main函數成功下做export_data()
。
您應該從 if 語句中取出 export_data()。 if 語句僅在計時器過期時才會執行。
每次運行 azure 函數時,您很可能希望 export_date() 。
試試這個(注意用戶定義的函數如何不再在 if 條件語句中,現在應該在函數運行時運行,而不僅僅是在計時器過期時):
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()
logging.info('Writing data to database')
export_data()
logging.info('Writing data to database complete')
if timer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.