cx_freeze部署:sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:mssql.pyodbc

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

我一直在努力应对以下运行时异常,并找到了解决方案,但我并不真正理解该解决方案为何有效。无论如何,我会发布我的代码和解决方案,以防它对其他人有所帮助。如果有人确切地知道为什么可以解决此问题,请分享您的想法。使用cx_freeze打包的代码在运行时发生异常。

这里是例外:

---------------------------
cx_Freeze: Python error in main script
---------------------------
Traceback (most recent call last):
  File "C:\apps\Anaconda3\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 40, in run
    module.run()
  File "C:\apps\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console.py", line 37, in run
    exec(code, {'__name__': '__main__'})
  File "c:\fccc\svn\shared\py\idw_jobs_ui.py", line 21, in <module>
    import sqla_declaratives.idw.bods_jobs.dag_ctrl as dc
  File "C:\fccc\svn\shared\py\sqla_declaratives\idw\bods_jobs\dag_ctrl.py", line 4, in <module>
    from sqla_utils.sqla_base import IdwBodsJobsBase
  File "C:\fccc\svn\shared\py\sqla_utils\sqla_base.py", line 74, in <module>
    class ClarityDboBase():
  File "C:\fccc\svn\shared\py\sqla_utils\sqla_base.py", line 77, in ClarityDboBase
    engine = sqla.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params, fast_executemany=True)#, echo = True) # uncomment to see all SQL
  File "C:\apps\Anaconda3\lib\site-packages\sqlalchemy\engine\__init__.py", line 479, in create_engine
    return strategy.create(*args, **kwargs)
  File "C:\apps\Anaconda3\lib\site-packages\sqlalchemy\engine\strategies.py", line 61, in create
    entrypoint = u._get_entrypoint()
  File "C:\apps\Anaconda3\lib\site-packages\sqlalchemy\engine\url.py", line 172, in _get_entrypoint
    cls = registry.load(name)
  File "C:\apps\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 268, in load
    "Can't load plugin: %s:%s" % (self.group, name)
sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:mssql.pyodbc

---------------------------
OK   
---------------------------

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

from cx_Freeze import setup, Executable
import os
import sys

buildOptions = dict(excludes = ['scipy'
                                  , 'PyQt5'
                                  , 'matplotlib'
                                  , 'numpy'
                                  , 'notebook'
                                  , 'jedi']
                    , namespace_packages = ['sqla_utils'
                                            , 'sqla_declaratives']
                    )

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

py_app_to_build = os.path.join(os.environ['IDW_HOME']
                               , 'shared'
                               , 'py'
                               , 'idw_jobs_ui.py'
                               )

executables = [
    Executable(script=py_app_to_build
               , 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)
python sqlalchemy cx-freeze
2个回答
0
投票

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


0
投票

因此,这里发生的是SQL Alchemy正在尝试加载MS SQL python驱动程序,但未找到。

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

解决方案是将

packages = ['sqlalchemy','pyodbc']
添加到cx_freeze脚本中的构建选项。请注意,两个软件包都是必需的!仅添加一个或另一个会导致不同的运行时错误。因此,此代码与原始代码相同,只是增加了这一行。
from cx_Freeze import setup, Executable
import os
import sys

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

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

py_app_to_build = os.path.join(os.environ['IDW_HOME']
                               , 'shared'
                               , 'py'
                               , 'idw_jobs_ui.py'
                               )

executables = [
    Executable(script=py_app_to_build
               , 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的安装前后的输出进行了比较,我看不出有任何差异可以解释为什么这可以解决问题。当然存在一些差异,但是我不明白为什么他们做到了。

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