如何解决由于Firebird客户端库而导致我的Python exe无法在其他计算机上运行的情况

时间:2019-04-17 08:18:57

标签: python exe firebird pyinstaller

我用 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客户端库有关。 我试图了解为什么会有这个问题以及如何解决。

  • 我首先虽然可能是因为fdb库是在“子文件”中导入的,所以它是隐藏的导入,而PyInstaller看不到它。我在主应用程序文件中导入了fdb,但问题仍然相同。
  • 我也查看了我的环境变量,以为也许我的另一台计算机错过了有关fd​​b的信息,但是在“源”计算机中没有看到任何与fdb相关的环境变量。

您对我为什么有这个问题有任何想法吗?是我需要放在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

我检查了数据库是否在正确的目录中(它正在“源”计算机上工作)。

2 个答案:

答案 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