我一直在努力应对以下运行时异常,并找到了解决方案,但我并不真正理解该解决方案为何有效。无论如何,我会发布我的代码和解决方案,以防它对其他人有所帮助。如果有人确切地知道为什么可以解决此问题,请分享您的想法。使用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)
该异常表示在sqlalchemy创建引擎时需要pyodbc包(依赖项)。安装pyodbc软件包,然后确保已安装ODBC驱动程序。
因此,这里发生的是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的安装前后的输出进行了比较,我看不出有任何差异可以解释为什么这可以解决问题。当然存在一些差异,但是我不明白为什么他们做到了。