((Python)使用cx_freeze部署sqlalchemy + mssql.pyodbc /遇到“没有名为'pyodbc'的模块”错误

问题描述 投票:0回答:2

我在以下异常中苦苦挣扎,并且找到了解决方案,但是我真的不明白为什么该解决方案有效。无论如何,我会发布我的代码和解决方案,以防它对其他人有所帮助。如果有人确切地知道为什么可以解决此问题,请分享您的想法。谢谢!!!!迈克

这里是例外:

---------------------------cx_Freeze:主脚本中的Python错误---------------------------追溯(最近一次通话):运行中的文件“ C:\ apps \ Anaconda3 \ lib \ site-packages \ cx_Freeze \ initscripts \ __ startup__.py”module.run()运行中的文件“ C:\ apps \ Anaconda3 \ lib \ site-packages \ cx_Freeze \ initscripts \ Console.py”,第37行exec(代码,{'__name__':'__main__'})在第21行的“ C:\ fccc \ svn \ shared \ py \ idw_jobs_ui.py”文件中导入sqla_declaratives.idw.bods_jobs.dag_ctrl作为dc文件“ C:\ fccc \ svn \ shared \ py \ sqla_declaratives \ idw \ bods_jobs \ dag_ctrl.py”,第4行,在从sqla_utils.sqla_base导入IdwBodsJobsBase文件“ C:\ fccc \ svn \ shared \ py \ sqla_utils \ sqla_base.py”,位于ClarityDboBase()类:ClarityDboBase中的文件“ C:\ fccc \ svn \ shared \ py \ sqla_utils \ sqla_base.py”,第77行engine = sqla.create_engine(“ mssql + pyodbc:///?odbc_connect =%s”%参数,fast_executemany = True)#,echo = True)#取消注释以查看所有SQL在create_engine中,第479行的文件“ C:\ apps \ Anaconda3 \ lib \ site-packages \ sqlalchemy \ engine \ __ init__.py”返回strategy.create(* args,** kwargs)创建文件“ C:\ apps \ Anaconda3 \ lib \ site-packages \ sqlalchemy \ engine \ strategies.py”,行87dbapi = dialect_cls.dbapi(** dbapi_args)dbapi中的文件“ C:\ apps \ Anaconda3 \ lib \ site-packages \ sqlalchemy \ connectors \ pyodbc.py”,第37行返回__import __(“ pyodbc”)ModuleNotFoundError:没有名为“ pyodbc”的模块

这是原始的Python cx_freeze脚本(不起作用):

来自cx_Freeze导入设置,可执行导入操作系统导入系统打印(sys.path)打印(os.environ ['IDW_HOME'])idw_ui_build_path = sys.pathbuildOptions = dict(不包括= ['scipy','PyQt5','matplotlib','numpy',“笔记本”,'jedi'],namespace_packages = ['sqla_utils','sqla_declaratives'])导入系统base ='Win32GUI'如果sys.platform =='win32'则其他可执行文件= [可执行文件('C:\\ fccc \\ svn \\ shared \\ py \\ idw_jobs_ui.py',base = base,targetName ='idw_pltfrm_edtr.exe')]设置(名称='idw_pltfrm_edtr',版本='0.1',description ='IDW平台编辑器',options = dict(build_exe = buildOptions),可执行文件=可执行文件)
python sqlalchemy cx-freeze
2个回答
0
投票

因此,这里发生的是SQL Alchemy试图加载MS SQL驱动程序-我相信-并没有找到它。

为了解决该问题,我最初明确地尝试将pyodbc Microsoft SQL Server驱动程序包括在cx_freeze脚本中,但是我可以看到,在原始cx_freeze程序包中,它已经在lib / sqlalchemy / dialects / mssql下。如果仔细查看原始异常,它将与该路径匹配。所以我不明白为什么会发生异常。

解决方案是在cx_freeze脚本中将

packages = ['sqlalchemy']
添加到构建选项。因此,此代码与原始代码相同,只是增加了这一行。

from cx_Freeze import setup, Executable

import os
import sys

print(sys.path)
print(os.environ['IDW_HOME'])
idw_ui_build_path = sys.path

buildOptions = dict(excludes = ['scipy'
                                  , 'PyQt5'
                                  , 'matplotlib'
                                  , 'numpy'
                                  , 'notebook'
                                  , 'jedi']
                    , packages = ['sqlalchemy']    # resolves runtime exception
                    , namespace_packages = ['sqla_utils'
                                            , 'sqla_declaratives']
                    )

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [
    Executable('C:\\fccc\\svn\\shared\\py\\idw_jobs_ui.py'
               , base=base
               , targetName = 'idw_pltfrm_edtr.exe')
]

setup(name='idw_pltfrm_edtr',
      version = '0.1',
      description = 'IDW Platform Editor',
      options = dict(build_exe = buildOptions),
      executables = executables)

我将cx_freeze的安装前后的输出进行了比较,我看不出有任何差异可以解释为什么这可以解决问题。当然存在一些差异,但是我不明白为什么他们做到了。


0
投票

该异常表示在sqlalchemy创建引擎时需要pyodbc包(依赖项)。安装pyodbc软件包,然后确保已安装ODBC驱动程序。

© www.soinside.com 2019 - 2024. All rights reserved.