ModuleNotFoundError: нет модуля с именем 'pyodbc', хотя пакет успешно установлен - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь развернуть код 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 находятся в режиме предварительного просмотра, поэтому функциональность может измениться в будущем.

...