我用 PyInstaller 创建了一个python exe。
我的exe在“源”计算机上运行良好。
当我尝试在另一台计算机上运行它时,出现此问题:
C:\Users\maell\Desktop\CreateSQL app V1\app>app.exe
Traceback (most recent call last):
File "app.py", line 68, in <module>
File "app.py", line 44, in show_DataBase_results
File "usefull_fonctions_fdb.py", line 5, in open_database
File "site-packages\fdb\fbcore.py", line 784, in connect
File "site-packages\fdb\fbcore.py", line 220, in load_api
File "site-packages\fdb\ibase.py", line 1385, in __init__
Exception: The location of Firebird Client Library could not be determined.
[9340] Failed to execute script app
问题显然与 Firebird客户端库有关。 我试图了解为什么会有这个问题以及如何解决。
您对我为什么有这个问题有任何想法吗?是我需要放在exe目录中的文件吗?或者我必须告诉PyInstaller吗?
编辑: 通过在我的exe目录中添加fbclient.dll,该错误已更改:
(base) C:\Users\maell\Desktop\app>app.exe
Traceback (most recent call last):
File "app.py", line 67, in <module>
File "app.py", line 43, in show_DataBase_results
File "usefull_fonctions_fdb.py", line 5, in open_database
File "site-packages\fdb\fbcore.py", line 848, in connect
fdb.fbcore.DatabaseError: ('Error while connecting to database:\n- SQLCODE: -904\n- unavailable database', -904, 335544375)
[11120] Failed to execute script app
我检查了数据库是否在正确的目录中(它正在“源”计算机上工作)。
答案 0 :(得分:1)
总而言之,Firebird客户端库是Firebird Server的一部分,而不是Python的一部分(尽管我不知道Python专门称为FCL,但希望它没有偏离标准术语),应将其命名为“ fbclient.dll” ”,也可以作为“ fbembed.dll”或“ gds32.dll”。事实是,当您尝试实际连接到数据库服务器时,会动态加载该DLL。
文件“ app.py”,第44行,在show_DataBase_results中
在open_database的第5行,文件“ usefull_fonctions_fdb.py”
您的日志显示您的app.exe
实际上试图连接到Firebird Server,以从某些“数据库”中读取一些“结果”。为此,需要Firebird Server。它将丢失-并且数据库读取失败。
现在,为什么您的安装(不是已安装的应用程序而是纯粹的安装)需要读取数据库,这对我来说似乎很奇怪,但我不知道。 找到并修复它,以便安装程序本身不会尝试让Firebird Server从Firebird数据库读取,那么错误将消失。
P.S。也可以查看这些讨论:
P.P.S。还有一个救生衣:
您有什么想法吗?它是文件吗?或者其他的东西?
当您问自己类似的问题时-尝试使用SysInternals Process Monitor
检查“ app.exe”在哪个特定文件(如果是文件)以及哪个特定文件夹中查找,然后抛出该错误。也许它查找的是注册表数据而不是文件等,所以-ProcMon也会存储注册表日志。
答案 1 :(得分:1)
尽管FDB是用于连接到Firebird的Python驱动程序,但它也需要本地Firebird客户端库(在Windows上为fbclient.dll
,在Linux上为libfbclient.so
)。我不知道PyInstaller,但我假设它仅打包Python代码或在特定位置需要本地依赖项。
该错误表明您的系统上未安装Firebird客户端库,或者如果已安装,则它与Python可执行文件的位数不同。如果Python是32位,则需要32位Firebird客户端库,如果是64位,则需要64位。
您将需要安装Firebird客户端库(例如,使用Firebird安装程序并使用最小客户端安装),或者了解如何使用PyInstaller显式包含依赖项。另外,您可以使用不需要本地依赖项的纯Python Firebird驱动程序pyfirebirdsql。