Я пытаюсь развернуть код Python для функций Azure. Функция загружает некоторые файлы с FTP-сервера, сохраняет их в каталоге приложения-функции хост-компьютера и загружает их в базу данных SQL Azure.
Первая часть работает правильно; файлы сохраняются в том же каталоге, что и основной файл Python.
Когда вызываются методы sqlalchemy (в частности, create_engine()
)
ModuleNotFoundError: No module named 'pyodbc'
выбрасывается.
(return __import__('pyodbc')
называется)
Когда я пытаюсь импортировать pyodbc специально, выдается тот же ModuleNotFoundError
.
Код отлично работает локально на моей машине.
Я указал путь к модулям в коде, таким образом, загружается SQLAlchemy (и другие модули, тоже как feedparser).
Я установил модули через консоль Kudu, следуя этому руководству:
(tl; dr делает venv и устанавливает с pip)
https://github.com/yokawasa/azure-functions-python-samples/blob/master/docs/install-python-modules.md
ОС хост-машины: версия ОС: 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. Там я установил pyodbc с рулевой рубкой прямо из бинарных файлов.
Я тоже пытался установить pyodbc в этом проекте с колесами, но это ничего не изменило.
Обновление 1 :
Я нашел этот пост в Stackoverflow, в котором говорится, что установка пользовательских драйверов невозможна в приложениях с функциями Azure.
Драйверы базы данных ODBC или OleDB в службе приложений Azure
Обновление 2 : после спотыкания о проблеме GitHub для функций azure cli
https://github.com/Azure/azure-functions-python-worker/issues/249#issuecomment-452478272
и попытался развернуть функцию в среде linux с помощью docker и pyodbc
наконец загружен. Однако спецификация драйвера для SQLAlchemy теперь неверна.
Я разверну эту функцию в веб-приложении Azure, поскольку знаю, что она будет работать там.
Функции Azure с Python находятся в режиме предварительного просмотра, поэтому функциональность может измениться в будущем.