【问题标题】:When using py2exe, PyQt application cannot load SQlite database使用 py2exe 时,PyQt 应用程序无法加载 SQlite 数据库
【发布时间】:2010-12-06 22:22:52
【问题描述】:

我的 PyQt 应用程序在 Linux 上运行时,在我的 Windows 构建环境中运行良好,或者在使用 py2exe 构建它的机器上冻结时运行良好。但是在将冻结的可执行文件及其支持文件移动到另一台机器后,它无法加载数据库驱动程序。

当我有 Python2.5 和更早版本的 PyQt 和 py2exe 时,它​​运行良好。但是在升级我的工具链后,我得到了这些错误:

  • dbname.open 返回错误
  • lastError(dbname) 是“未加载驱动程序”

我有一个放置 qsqlite4.dll 的 sqldrivers 文件夹。这对于以前的构建环境是必要的,但移动或重命名该 DLL 不会改变任何行为。我认为这是 Qt 找不到的 DLL,但我无法告诉 Qt 去哪里查找。

我目前正在运行这些版本:

  • python-2.6.3
  • PyQt-Py2.6-gpl-4.6-1
  • py2exe-0.6.9.win32-py2.6

在 Dependency Walker 中进行分析给了我这个错误:
LoadLibraryW("\application\sqldrivers\qsqlite4.dll") 返回 NULL。错误:此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题 (14001)。
当我向 Dependency Walker 询问有关 Qsqlite4.dll 的详细信息时,它说:
错误:“\application\sqldrivers\QSQLITE4.DLL”的并行配置信息包含错误。

这可以解释为什么 DLL 无法加载,但我仍然不清楚如何修复它。仔细检查显示我调用的大多数 DLL 的错误。我需要为我加载的每个 Qt DLL 包含一个清单吗?

提前致谢。

【问题讨论】:

  • 更新:遵循#pyqt 上的提示并制作了一个指定 qsqlite4.dll 路径的 qt.conf。然后 Dependency Walker 不再抱怨,而是抱怨找不到 zlib.pyd。我试图在我的构建框(不存在)上找到 zlib.pyd,并试图让 py2exe 包含它(它不会)。我回滚到 Python 2.5、py2.5 的 py2exe 0.6.9 和 2.5 的 PyQt 4.4.3。该应用程序在此配置中似乎加载得很好,但现在我需要从我的代码中删除 PyQt4.6-isms。我最终仍然需要升级,因此非常感谢任何有关如何升级的建议。
  • 更新 2:由于我添加了一些新功能,因此无法选择降级。所以我尝试了 cx-freeze,但我得到了相同的行为——没有加载数据库驱动程序。我切换回 py2exe,并分析了一个工作应用程序(在构建机器上运行)和一个非工作应用程序(在另一台机器上运行)。输出似乎相同(它们都包含 zlib.pyd 错误),所以我认为这不是问题。

标签: sqlite pyqt4 py2exe


【解决方案1】:

来自未来的亲爱的人们:这就是我们目前所发现的......

接受的答案并没有真正说明他们复制了哪些 dll 以及在什么位置。我设法通过将驱动程序复制到相对于 exe 和 qt dll 所在位置的sqldrivers 目录中来修复它(我正在使用 PySide,但也应该与 PyQt4 一起使用)。在 setup.py 中:

setup(
    ...,
    data_files = [('sqldrivers', ('C:\Python27\Lib\site-packages\PySide\plugins\sqldrivers\qsqlite4.dll',))],
    ...,
)

【讨论】:

    【解决方案2】:

    我解决了!

    我有一个非常聪明的方法来避免让我的用户安装 vcredist——我将清单和 DLL 复制到两个地方,关于 MS DLL 的所有错误都消失了。那时我开始试图找出这个 SQLite 驱动程序错误。

    我并没有我想象的那么聪明。如果我安装 vcredist,所有“未加载驱动程序”和“未找到 SQL 驱动程序”错误都会消失。参数。

    【讨论】:

      【解决方案3】:

      尝试重新安装 SOLite,或者验证您是否将 DLL 放在正确的位置,因为我记得 MySQL DLL 必须在 System32 目录中才能开发使用它的东西。

      问候。

      【讨论】:

      • 感谢您的建议。由于 SQLite 现在包含在 Python 中,因此无需安装。我尝试在包中明确包含 sqlite3.dll,但没有任何区别。
      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多