首页 > 解决方案 > ModuleNotFoundError: No module named 'pyodbc' 虽然包成功安装

问题描述

我正在尝试将 python 代码部署到 azure 函数。该函数从 FTP 服务器下载一些文件,将它们保存在主机的函数应用目录中,然后将它们上传到 Azure SQL DB。

第一部分工作正常;这些文件保存在与主要 python 文件相同的目录中。

当调用 sqlalchemy 方法时(特别是create_engine()ModuleNotFoundError: No module named 'pyodbc'抛出 a 。(return __import__('pyodbc')被称为)

当我尝试专门导入 pyodbc 时,ModuleNotFoundError也会抛出同样的问题。

该代码在我的机器上本地运行良好。

我在代码中指定了模块的路径,因此加载了 SQLAlchemy(以及其他模块,也像 feedparser)。

我按照本教程通过 Kudu 控制台安装了模块:(tl;dr make venv and install with pip)

https://github.com/yokawasa/azure-functions-python-samples/blob/master/docs/install-python-modules.md

主机操作系统:操作系统版本:Microsoft Windows NT 10.0.14393.0 64 bit System

# -*- 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 函数应用程序上安装自定义驱动程序。

Azure 应用服务下的 ODBC 或 OleDB 数据库驱动程序

更新 2:在偶然发现 GitHub 上的 Azure 函数 cli 问题后

https://github.com/Azure/azure-functions-python-worker/issues/249#issuecomment-452478272

并尝试在最终加载 docker 和 pyodbc 的 linux 环境中部署该功能。但是,SQLAlchemy 的驱动程序规范现在是错误的。

我将在 Azure Web App 中部署该功能,因为我知道它将在那里工作。带有 Python 的 Azure 函数处于预览阶段,因此该功能将来可能会发生变化。

标签: pythonazure-functionspython-import

解决方案


推荐阅读