Развертывание cx_freeze: sqlalchemy.ex c .NoSuchModuleError: Не удается загрузить плагин: sqlalchemy.dialects: ms sql .pyodbc - PullRequest
0 голосов
/ 03 мая 2020

Я боролся со следующим исключением во время выполнения и нашел решение, но я не совсем понимаю, почему это решение работает. В любом случае, я публикую свой код и решение на случай, если оно кому-нибудь поможет. Если кто-то точно понимает, почему это решает проблему, поделитесь своими мыслями. Исключение возникает во время выполнения с кодом, упакованным 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)

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Исключение говорит, что нужен пакет pyodb c при создании движка sqlalchemy (зависимости). Установите пакет pyodb c, затем убедитесь, что установлен драйвер ODB C.

0 голосов
/ 03 мая 2020

То, что здесь происходит, это то, что SQL Alchemy пытается загрузить драйвер MS SQL python, но он не найден.

Для решения проблемы, которую я изначально явно пытался включить python pyodb c Microsoft SQL Серверный драйвер в скрипте cx_freeze, но я мог видеть, что в оригинальном пакете cx_freeze он уже был там в lib / sqlalchemy / dialects / ms sql. Если вы внимательно посмотрите на исходное исключение, оно соответствует этому пути. Поэтому я не понимаю, почему возникло исключение.

Решением было добавить

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'] #fixed issue both are needed!
                    , 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, и я не вижу никаких отличий, которые мне точно объясняют почему это решает проблему. Конечно, было несколько отличий, но я просто не понимаю, почему они добились цели.

...