我正在尝试将python代码部署到Azure函数。该功能从FTP服务器下载一些文件,将其保存在主机的功能应用程序目录中,然后将其上传到Azure SQL DB。
第一部分工作正常;这些文件与python主文件保存在同一目录中。
当调用sqlalchemy方法时(特别是create_engine()
)
抛出ModuleNotFoundError: No module named 'pyodbc'
。
(称为return __import__('pyodbc')
)
当我尝试专门导入pyodbc时,会抛出相同的ModuleNotFoundError
。
代码在我的计算机上本地正常运行。
我在代码中指定了模块的路径,因此SQLAlchemy会加载(以及其他模块,例如feedparser)。
我按照本教程通过Kudu控制台安装了模块: (tl; dr制作venv并使用pip安装)
主机的操作系统:OS版本:Microsoft Windows NT 10.0.14393.0 64位系统
# -*- coding: utf-8 -*-
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname( __file__ ), 'env/Lib/site-packages')))
from ftplib import FTP
from ast import literal_eval
import csv
import json
from sqlalchemy import create_engine, MetaData, Table
import pyodbc
def post_processing(input, output, csv_counter, header):
'''Removes uneccessary headers from the csv files and writes the data
into a csv file'''
# code...
return csv_counter, header
def download():
# first gets all the dates as the base for the full paths
# afterwards build each possible path to a csv file
# structure or dimensions of folders has to be known in advance
# advantage: specific folders are not hardcoded
# code...
return response
def upload():
postreqdata = json.loads(open(os.environ['req']).read())
response = open(os.environ['res'], 'w')
response.write("Finito" + postreqdata["name"])
response.close()
try:
# dev settings
f = open("connection\\con_info_sink.txt", "r")
connection_info = literal_eval(f.read())
f.close()
except FileNotFoundError:
# prod settings
connection_info = {
"db_user": os.environ["DB_USER"],
"db_password": os.environ["DB_PASSWORD"],
"db_name": os.environ["DB_NAME"],
"db_host": os.environ["DB_HOST"],
}
engine = create_engine(
"mssql+pyodbc://{db_user}:{db_password}@{db_host}/{db_name} ?driver=ODBC+Driver+13+for+SQL+Server".format(**connection_info), convert_unicode=True)
# orm mapping
metadata = MetaData(engine)
pcards = Table("pcardlog", metadata, autoload=True, schema='staging')
col_names_pcard = pcards.columns.keys()
fakedata_pcard = []
with open('source.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
fakedata_pcard.append(
{col_names_pcard[0]: row[0],
col_names_pcard[1]: row[1],
col_names_pcard[2]: row[2],
col_names_pcard[3]: row[3],
col_names_pcard[4]: row[4],
col_names_pcard[5]: row[5],
col_names_pcard[6]: row[6],
})
con = engine.connect()
con.execute(pcards.insert(), fakedata_pcard)
return response
if __name__ == "__main__":
response = download()
response = upload()
我希望pyodbc能够顺利加载,因为我已经在Azure中部署了一个Web应用程序。在那里,我直接从二进制文件中安装了带有舵手室的pyodbc。
我也尝试在这个带有轮子的项目上安装pyodbc,但这并没有改变。
更新1 : 我在Stackoverflow上发现了该帖子,指出无法在azure函数应用程序上安装自定义驱动程序。
ODBC or OleDB database drivers under Azure App Service
更新2 :在AZure函数cli的GitHub问题上碰到
https://github.com/Azure/azure-functions-python-worker/issues/249#issuecomment-452478272
并尝试使用docker和pyodbc在Linux环境中部署该功能 终于装好了。但是,SQLAlchemy的驱动程序规范现在是错误的。
我将在Azure Web App中部署该功能,因为我知道该功能将在其中运行。 带有Python的Azure功能已在Preview中,因此该功能将来可能会更改。