ibm_db、pyinstaller、DLL 问题

ibm_db, pyinstaller, DLL issue

我的问题是:
我正在尝试打包下面提到的具有导入 ibm_db 的简单代码,但我做不到,因为它给了我下面提到的错误。我在 SO 和其他网站上进行了很多研究,但我遇到的大多数解决方案都说使用 --add-binary 添加 DLL,我也尝试过,但仍然出现以下错误.
我正在使用 Windows 10 64 位 OS,基于 x64 的处理器。
我正在使用使用 python -m venv env
创建的虚拟环境 我的虚拟环境中安装了下面提到的包。
我希望所有这些细节都足够并且可以作为一个问题。

-- PYTHON 版本 --
Python3.7.8

-- PYTHON 安装的软件包--
高度图 0.17
未来 0.18.2
IBM-DB 3.0.2
文件 2019.4.18
点 20.1.1
PyInstaller 3.6
pywin32-ctypes 0.2.0
安装工具 47.1.0

--我的代码--

import ibm_db<br>
print(ibm_db.`__version__`)<br>

-- 使用 PYINSTALLER 为我的上述代码创建包 --
pyinstaller --noconfirm ^
--name=测试^
--hidden-import "pkg_resources.py2_warn" ^
--add-binary C:\Users\vrajendrasinghpar\Desktop\test\env\Lib\site-packages\ibm_db_dlls\ibm_db.dll;.\ibm_db_dlls ^
test_ibm_db.py

-- 出现以下错误--

Traceback (most recent call last):<br>
  File "test\test_ibm_db.py", line 1, in `<module>`<br>
  File "c:\users\vrajendrasinghpar\desktop\test\env\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module<br>
    exec(bytecode, module.`__dict__`)<br>
  File "lib\site-packages\ibm_db.py", line 28, in `<module>`<br>
  File "lib\site-packages\ibm_db.py", line 26, in `__bootstrap__`<br>
  File "imp.py", line 345, in load_dynamic<br>
ImportError: DLL load failed: The specified module could not be found.<br>
[27420] Failed to execute script test_ibm_db<br>

您的问题没有提到构建主机名是否与 运行 主机名相同。

此答案假设您运行在不同于构建主机名的 Microsoft-Windows 主机名上安装构建的可执行文件(pyinstaller 的输出)。

如果您使用的是 IBM 提供的 clidriver(python ibm_db 的默认设置),并且目标环境中尚未安装它,并且 IBM 提供了替代的 Db2 CLI 驱动程序也未预安装在目标环境中,因此您必须在构建时将 clidriver 与 pyinstaller 输出捆绑在一起。

您可以将 clidriver 树内容包含在 pyinstaller 的 附加 参数中:

--add-data="c:\path\to\clidriver;.\clidriver" ^

您可以使用 pip show ibm_db 找到 clidriver 的路径并将 clidriver 附加到 Location: 名称。

如果你这样捆绑,有一些注意事项:

  • 您的捆绑包已“及时冻结”。当 IBM 更新其 clidriver 时,您之前构建的可执行文件将无法从安全修复、缺陷修复和增强中受益,除非您重新 运行 pystaller 以包含最新的 clidriver 并重新分发。 IBM 通常每年至少更新此 clidriver 两次。如果您使用加密连接 (TLS/SSL),这一点尤为重要。

  • 由于其中包含 clidriver,您的包大小将会增加。

  • 在目标 Microsoft-Windows 环境中,解压缩 dist$name 后,您可能需要 运行 clidriver\bin\db2cli install -setup 来注册Microsoft Windows 的组件。这允许 odbcad32 了解驱动程序并允许通过 odbcad32 GUI 进行一些配置功能。

  • 还必须在每个目标主机名上满足 clidriver 的任何依赖关系。