如何使用 pyinstaller 从 python 脚本生成 exe,可用于使用 ibm_db 模块连接到 DB2

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

我制作了一个使用 ibm_db python 模块连接到 DB2 的脚本。通过脚本运行时它工作正常,但当我将其转换为 exe 时,我收到错误,因为 [IBM][CLI Driver] SQL10007N 无法检索消息“0”。原因代码:“6”。 SQL代码=-1042

首先,在脚本中运行

import ibm_db
时,我遇到了此错误 ImportError: DLL load failed while importing ibm_db: 找不到指定的模块。 我使用
os.add_dll_directory("C:\\..\\clidriver\\bin")

解决了这个问题

但是当我使用 pyinstaller --onefile 命令创建 exe 时,我收到此错误 [IBM][CLI Driver] SQL10007N 无法检索消息“0”。原因代码:“6”。 SQL代码=-1042

任何人都可以提供详细的解决方案来解决这个问题

python dll db2 pyinstaller
1个回答
0
投票

此答案特定于以下组件,它可能不适用于其他版本,也不适用于其他操作系统:

  • 微软-Windows x64
  • 点24.1.1
  • pyinstaller 6.6.0 或更高版本。
  • ibm_db 版本 3.2.3 作为轮子提供。
  • 使用默认提供的clidriver
    pip install ibm_db

验证您的脚本是否在没有 pyinstaller 的情况下正确运行(即未捆绑)。

你需要两件事:

  • 您的 Python 脚本在导入 ibm_db 之前需要启动代码(请参阅下面的示例)来定位 clidriver,无论您的脚本是未捆绑运行还是捆绑运行(使用 pyinstaller),以便对

    add_dll_directory
    的调用在任何一种情况下都可以工作。

  • 该捆绑包必须将 clidriver 树作为

    --add-binary
    包含在名为 clidriver 的子目录中。

始终先捆绑到单文件夹(即不使用

--onefile
选项)并在尝试
--onefile
选项之前让单文件夹方法正常工作。

import ibm_db
之前的示例代码如下:

import sys 
import os

# for ibm_db version 3.2.3 on microsoft-windows, works with/without pyinstaller.
# This is only valid if using clidriver (which comes by default with ibm_db wheels).
# For pyinstaller on ms-windows, use --add-binary /path/to/clidriver:./clidriver .
if ( sys.platform == "win32" ):
    site_packages=""
    clidriver_bin=""
    program_directory = os.path.dirname(os.path.abspath( __file__ ))
    
    for directory in sys.path:
        if 'clidriver' in directory and 'bin' in directory:
            clidriver_bin = directory
            break
        if 'site-packages' in directory:
            site_packages = directory
    
    if site_packages != "" and clidriver_bin == "": 
        clidriver = os.path.join(site_packages , "clidriver")
        clidriver_bin = os.path.join(clidriver, "bin") 
    
    if clidriver_bin == "" and site_packages == "": 
        clidriver_subdir = os.path.join( program_directory , "clidriver")
        if  os.path.isdir(clidriver_subdir):
            clidriver_bin = os.path.join(clidriver_subdir , "bin")
        else:
            print("Failed to find a bundled clidriver directory at: " + clidriver_subdir )
            sys.exit()

    if clidriver_bin != "" and os.path.isdir(clidriver_bin):
        os.add_dll_directory(clidriver_bin)
    else:
        print("Missing directory: " + clidriver_bin )
        sys.exit()

import ibm_db

如果您的 python 脚本名为 myscript.py,并包含上述片段,则将其捆绑到单个文件夹的示例命令行是(将

c:\path\to\clidriver
替换为您的 real 站点包位置):

pyinstaller -y --add-binary c:\path\to\site-packages\clidriver:./clidriver  myscript.py

当且仅当该方法有效时,您可以使用以下命令创建可执行文件:

pyinstaller -y --add-binary c:\path\to\site-packages\clidriver:./clidriver --onefile myscript.py

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