ModuleNotFoundError:虽然成功安装了软件包,但没有名为“ pyodbc”的模块

时间:2019-01-04 17:13:19

标签: python azure-functions python-import

我正在尝试将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安装)

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

主机的操作系统: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中,因此该功能将来可能会更改。

0 个答案:

没有答案