python - 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)
主机操作系统:操作系统版本: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 函数处于预览阶段,因此该功能将来可能会发生变化。
解决方案
推荐阅读
- python - numpy中的多维累积和
- ios - 如何使用 ARKit 或 Apple Vision 测量 3d 对象的尺寸?
- c++ - 避免只在源文件中定义的类的弱 vtable 警告
- c# - 在类“程序”上调用方法“BuildWebHost”时发生错误。在没有应用程序服务提供者的情况下继续 - ASP.NET CORE 迁移
- azure - 您可以删除 Microsoft.Web/certificates 吗?
- angular - 如何在 Angular 2 中为单元测试创建新事件?
- c++ - 有没有办法使用 Boost 获得区域时间格式?
- angular - 使用 Angular 5 在 Material 组件中进行分页
- javascript - 笑话:特定选择器
- java - 如何可靠地停止 spring+pdfbox 应用程序中的 tomcat 线程?