ImportError:DLL加载失败-仅当使用IBM DB模块时



Am observing"DLL LOAD FAILED错误消息,当在python或internet连接不可用的服务器中以exe文件的形式运行我的python文件时。我的其他exe文件没有任何问题,这个包含IBMDB模块的文件是唯一有问题的文件。

我尝试了这里给出的解决方案:ImportError:DLL加载失败:找不到指定的模块--IBMDB2-仍然面临问题。

当我在本地机器(笔记本电脑(中运行相同的exe文件时——它正在工作,但在服务器中——它不工作。

下面是我用来转换exe文件的命令:

pyinstaller -y --additional-hooks-dir=. --hidden-import ibm_db_sa.ibm_db --hidden-import ibm_db_dbi --hidden-import ibm_db --add-binary C:PythonPython37Libsite-packagesibm_db_dllsibm_db.dll;.ibm_db_dlls --onefile mypythonfile.py

以下是我运行exe文件时的错误消息:

E:SuspenseReport>mypythonfile.exe
c:pythonpython37libsite-packagesPyInstallerloaderpyimod03_importers.py:62
3: MatplotlibDeprecationWarning:
The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and wil
l be removed in 3.3.
Traceback (most recent call last):
File "mypythonfile.py", line 14, in <module>
import ibm_db
File "c:pythonpython37libsite-packagesPyInstallerloaderpyimod03_importe
rs.py", line 623, in exec_module
File "site-packagesibm_db.py", line 10, in <module>
File "site-packagesibm_db.py", line 9, in __bootstrap__
File "imp.py", line 342, in load_dynamic
ImportError: DLL load failed: The specified module could not be found.
[16360] Failed to execute script mypythonfile

版本:

Python Version: 3.7.6
Pyinstaller Version: 3.6
ibm-db Version: 3.0.1
os : Windows

请告知如何解决此问题。

我更新了您引用的另一个答案。

如果您的python代码没有明确使用SQLAlchemy,则不需要将其包含在pyinstaller构建命令行中。如果您使用的是SQLAlchemy,那么您可能需要其他答案中提到的附加挂钩。

由于将EXE部署在与生成环境(工作站(不同的主机名(服务器(上,因此目标服务器可能尚未安装Db2客户端。

python ibm_db使用CLI(调用级接口(访问Db2数据库。Db2客户端提供了这样的CLI接口。如果您没有任何可用于ibm_db的Db2客户端,那么ibm_db模块将无法加载,您将看到您的症状。当您安装ibm_db时,默认情况下,它会在您的工作站上添加一个名为clidriver的小型Db2客户端(零安装(,但pyinstaller不会将其包含在您的捆绑包中。

如果服务器尚未安装Db2客户机,并且您不希望单独安装和配置Db2客户端,那么您可以重新构建pyinstaller捆绑包,以包含python ibm_db模块默认提供的clidriver。要重新生成,您需要在pyinstaller中包含其他命令行选项。

要包含clidriver,首先通过命令pip show ibm_db找到它的位置,然后找到Location:值,并将clidriver值附加到此路径。这是通往clidriver的完全合格路径,例如c:pathtoclidriver

接下来,使用附加选项重新运行您以前的pyinstaller命令

CCD_ 6";

如果您的python代码依赖于外部配置的DSN(而不是代码中的长连接字符串(,并且您制作了一个合适的db2dsdriver.cfg文件,其中包含这些DSN以及每个数据库或DSN所需的任何参数,那么您还需要在捆绑包中包含该db2dsdriver.cfg文件。如果您的代码不依赖于外部配置的DSN,则可能不需要此步骤。您还可以编写db2cli命令行脚本,使其在服务器上运行,以配置db2dsdriver.cfg,而不是绑定它(如果您喜欢的话(。

如果您需要使用目标服务器主机名上的odbcad32.exe可执行文件来配置Db2 DSN,您还需要在以管理员身份从clidriver\bin目录运行其db2cli install -setup可执行文件,从而交付pyinstaller构建的EXE文件后,在目标服务器上运行clidriver setup命令行。如果您不需要在目标主机名上使用类似odbcad32.exe的GUI,则可以省略此步骤。

如果您使用到Db2的加密连接(即SSL/TLS(或基于证书的身份验证,那么您的捆绑包可能还需要包括相关证书和/或密钥库/存储库。因此,您可能需要pyinstaller版本的其他选项。

在目标服务器上,将完全限定的clidriver\bin目录添加到PATH环境变量中可能很有用。确保包含任何配置文件或数据文件的目录对需要访问它们的任何用户或组都是可读的。

此外,请注意,IBM每年都会更新其clidriver软件几次,其中包括安全修复和错误修复以及新功能。测试后,您的pyinstaller构建的EXE应该被刷新并重新分发,以包括刷新的clidriver。

最新更新