“无法确定 Firebird 客户端库的位置。”

Oll*_*lli 5 python linux ubuntu firebird client-library

我遇到了与此处讨论的类似问题:

\n\n

Firebird嵌入式安装问题:无法确定库

\n\n

我正在通过连接到 firebird 数据库的 ubuntu (16.04.4 LTS) 运行 python(3.5.2) 脚本。为了安装 firebird,我按照此处提供的说明进行操作:

\n\n

https://firebirdsql.org/manual/ubusetup.html

\n\n

现在,当我运行 python 代码时,会显示以下错误:

\n\n
Soft limit starts as  :-1\nSoft limit changed to :1024\nTraceback (most recent call last):\n  File "clustering_setup.py", line 30, in <module>\n    graph, posi_knoten, kanten_bewertung, auslassliste = build_netzwerk.create_graph()\n  File "/home/ubuntu/Documents/Code/build_netzwerk.py", line 113, in create_graph\n    datenbank_custom.start(config.idbf_file)\n  File "/home/ubuntu/Documents/Code/datenbank_custom.py", line 19, in start\n    con = fdb.connect(database=idbf_file, user=\'sysdba\', password=\'pass\')\n  File "/home/ubuntu/.local/lib/python3.5/site-packages/fdb/fbcore.py", line 682, in connect\n    load_api(fb_library_name)\n  File "/home/ubuntu/.local/lib/python3.5/site-packages/fdb/fbcore.py", line 181, in load_api\n    setattr(sys.modules[__name__],\'api\',fbclient_API(fb_library_name))\n  File "/home/ubuntu/.local/lib/python3.5/site-packages/fdb/ibase.py", line 1398, in __init__\n    raise Exception("The location of Firebird Client Library could not be determined.")\nException: The location of Firebird Client Library could not be determined.\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我检查文件所在的位置,则会显示以下内容:

\n\n
ubuntu@ubuntu:~$ dpkg -L firebird2.5-classic-common\n/.\n/usr\n/usr/share\n/usr/share/lintian\n/usr/share/lintian/overrides\n/usr/share/lintian/overrides/firebird2.5-classic-common\n/usr/share/doc\n/usr/bin\n/usr/bin/qli\n/usr/bin/nbackup\n/usr/bin/fbstat\n/usr/bin/fbtracemgr\n/usr/bin/gdef\n/usr/bin/gsec\n/usr/bin/isql-fb\n/usr/bin/gpre\n/usr/bin/gbak\n/usr/bin/fbsvcmgr\n/usr/bin/gfix\n/usr/lib\n/usr/lib/firebird\n/usr/lib/firebird/2.5\n/usr/lib/firebird/2.5/UDF\n/usr/lib/firebird/2.5/UDF/ib_udf.so\n/usr/lib/firebird/2.5/UDF/fbudf.so\n/usr/sbin\n/usr/sbin/fb_lock_print\n/usr/share/doc/firebird2.5-classic-common\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出locate libfbclient

\n\n
/usr/lib/x86_64-linux-gnu/libfbclient.so.2\n/usr/lib/x86_64-linux-gnu/libfbclient.so.2.5.4\n/usr/share/doc/libfbclient2\n/var/cache/apt/archives/libfbclient2_2.5.4.26856.ds4-1build1_amd64.deb\n/var/lib/dpkg/info/libfbclient2:amd64.list\n/var/lib/dpkg/info/libfbclient2:amd64.md5sums\n/var/lib/dpkg/info/libfbclient2:amd64.postinst\n/var/lib/dpkg/info/libfbclient2:amd64.postrm\n/var/lib/dpkg/info/libfbclient2:amd64.preinst\n/var/lib/dpkg/info/libfbclient2:amd64.shlibs\n/var/lib/dpkg/info/libfbclient2:amd64.symbols\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用cat /etc/ld.so.conf.d/*导致:

\n\n
ubuntu@ubuntu:~/Documents/Code$ cat /etc/ld.so.conf.d/*\n/usr/lib/x86_64-linux-gnu/libfakeroot\n# Multiarch support\n/lib/i386-linux-gnu\n/usr/lib/i386-linux-gnu\n/lib/i686-linux-gnu\n/usr/lib/i686-linux-gnu\n# libc default configuration\n/usr/local/lib\n# Multiarch support\n/lib/x86_64-linux-gnu\n/usr/lib/x86_64-linux-gnu\n/usr/lib/x86_64-linux-gnu/mesa-egl\n/usr/lib/x86_64-linux-gnu/mesa   \n
Run Code Online (Sandbox Code Playgroud)\n\n

结果为ldconfig -p | grep libfbclient

\n\n
libfbclient.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libfbclien.so.2\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我正在运行的脚本!

\n\n
from datetime import datetime\nimport funcs\nimport build_netzwerk\nfrom scipy.optimize import minimize_scalar\nimport matplotlib.pyplot as plot\nimport funcs_nachbearb\nimport config\n\nstart = datetime.now()\n\n# abstandsgewichteten Graphen berechnen\ngraph, posi_knoten, kanten_bewertung, auslassliste = build_netzwerk.create_graph()\n\n# zur\xc3\xbcckgegebene Werte bestimmen\nif config.clusteringtyp == \'sohlhoehe\':\n    kanten_durchfluss = kanten_bewertung[1].copy()\n    kanten_bewertung = kanten_bewertung[0].copy()\nelif config.clusteringtyp == \'durchfluss\':\n    kanten_durchfluss = kanten_bewertung.copy()\nelse:\n    kanten_durchfluss = kanten_bewertung.copy()\n    kanten_bewertung = None\n\n# minimalen Optimierungsfaktor bestimmen\nprint(datetime.now() - start)\nerg_min = minimize_scalar(funcs.optimiere_cluster, args=(graph, kanten_bewertung, auslassliste, \'min\'),\n                          bounds=(0, 10), method=\'bounded\')\n# print(erg_min)\n\n# maximalen Optimierungsfaktor bestimmen\nprint(datetime.now() - start)\nerg_max = minimize_scalar(funcs.optimiere_cluster, args=(graph, kanten_bewertung, auslassliste, \'max\'),\n                          bounds=(erg_min.x, 10), method=\'bounded\')\n# print(erg_max)\n\n# besten Optimierungsfaktor bestimmen\nprint(datetime.now() - start)\nclustersammlung = funcs.bruteforce_optim(erg_min.x, erg_max.x, graph, kanten_bewertung, auslassliste,\n                                         kanten_durchfluss)\n\nprint(datetime.now() - start)\n\n# Clusternummerierung soll von 0 bis Anzahl gew\xc3\xbcnschter Cluster laufen\nfuncs_nachbearb.transform_clusternummern(clustersammlung)\n\n# Bewertung der Cluster berechnen\nprint(funcs_nachbearb.cluster_bewertung(clustersammlung, graph, kanten_durchfluss))\n\n# Clusterhierarchie berechnen\nprint(funcs_nachbearb.cluster_hierarchie(clustersammlung, graph))\n\n# Sch\xc3\xa4chte der Messstationen ausgeben\nms = ""\nfor key in clustersammlung.keys():\n    ms = ms + clustersammlung[key].endpoint + ", "\nms.rstrip(", ")\nprint("Messstationen: " + ms)\n\n# Einflussgebiete auf die Messstationen ausgeben\nprint("Einflussgebiete:")\nfor key in clustersammlung.keys():\n    print("Einflussgebiet von Cluster " + str(key) + ": " + ", ".join(clustersammlung[key].nodes))\n\n\nprint(datetime.now() - start)\n\n# entstehenden Grpahen mit Clustern zeichnen\nfuncs.draw_clustered_graph(graph, posi_knoten, clustersammlung)\nplot.show()\n\n\nprint(datetime.now() - start)\n
Run Code Online (Sandbox Code Playgroud)\n\n

数据银行_自定义:

\n\n
import fdb\n\ncon = None\n\n\ndef start(idbf_file):\n    """\n    Verbindung mit idbf-Datenbank aufbauen\n\n    :param idbf_file: (str) Dateipfad zur Datenbank\n    """\n\n    global con\n    con = fdb.connect(database=idbf_file, user=\'sysdba\', password=\'pass\')\n\n\ndef stop():\n    """\n    Verbindung mit idbf-Datenbank trennen\n    """\n\n    global con\n    con.close()\n\n\ndef read_from_db_single(sqlstatement):\n    """\n    Allgemeine Funktion um einen einzelnen Wert aus dem IDBF-File auszulesen\n\n    :param sqlstatement: (str) SQL-Abfrage zum auslesen eines Wertes\n\n    :return results: abgefragter Wert\n    """\n\n    curs = con.cursor()  # Use a client side cursor so you can access curs.rowcount\n    curs.execute(sqlstatement)\n    results = curs.fetchone()\n\n    if results:\n        results = results[0]\n\n    del curs\n    return results\n\n\ndef read_from_db(sqlstatement):\n    """\n    Allgemeine Funktion um Daten aus dem IDBF-File auszulesen\n\n    :param sqlstatement: (str) SQL-Abfrage an Datenbank\n\n    :return results: R\xc3\xbcckgabe der Abfrage\n    """\n\n    curs = con.cursor()  # Use a client side cursor so you can access curs.rowcount\n    curs.execute(sqlstatement)\n    results = curs.fetchall()\n\n    del curs\n    return results\n\n\ndef read_network(infotyp=None):\n    """\n    Gibt die Knoten und die Kanten f\xc3\xbcr das Kanalnetzmodel zur\xc3\xbcck.\n    Alle Schachttypen sind Knoten, alle Haltungen, Sonderbauwerke, ... sind Kanten\n\n    :param infotyp: (str) String zur Erweiterung der SELECT-Werte an die Kanten\n\n    :return results_knoten: (list(tuple(str, float, float))) Listen der Knoteninformationen\n    :return results_kanten: (list(tuple(str, float, float, [...]))) Listen der Kanteninformationen;\n                            list(tuple(name, schachtoben, -unten, infotyp[i])\n    :return results_sonderkanten: (list(tuple(str, float, float))) Listen der Sonderkanteninformationen\n    """\n\n    erweiterung = \'\'\n    if infotyp is not None:\n        erweiterung = infotyp\n\n    knoten = "SELECT name,XKOORDINATE,YKOORDINATE from SCHACHT UNION " + \\\n             "SELECT name,XKOORDINATE,YKOORDINATE from SPEICHERSCHACHT UNION " + \\\n             "SELECT name,XKOORDINATE,YKOORDINATE from AUSLASS;"\n\n    kanten = "SELECT name,schachtoben,schachtunten" + erweiterung + " from ROHR UNION " + \\\n             "SELECT name,schachtoben,schachtunten" + erweiterung + " from HREGLER UNION " + \\\n             "SELECT name,schachtoben,schachtunten" + erweiterung + " from QREGLER;"\n\n    sonderkanten = "SELECT name,schachtoben,schachtunten from DROSSEL UNION " + \\\n                   "SELECT name,schachtoben,schachtunten from GRUNDSEITENAUSLASS UNION " + \\\n                   "SELECT name,schachtoben,schachtunten from PUMPE UNION " + \\\n                   "SELECT name,schachtoben,schachtunten from SCHIEBER UNION " + \\\n                   "SELECT name,schachtoben,schachtunten from WEHR;"\n\n    curs = con.cursor()  # Use a client side cursor so you can access curs.rowcount\n\n    curs.execute(knoten)\n    results_knoten = list(curs.fetchall())\n\n    curs.execute(kanten)\n    results_kanten = list(curs.fetchall())\n\n    curs.execute(sonderkanten)\n    results_sonderkanten = list(curs.fetchall())\n\n    del curs\n\n    return results_knoten, results_kanten, results_sonderkanten\n
Run Code Online (Sandbox Code Playgroud)\n\n

我很感激您对此的建议,因为我完全不知道如何解决该特定问题!

\n

Mar*_*eel 4

我安装了 Ubuntu 16.04.4 作为一个新的虚拟机,并且只做了sudo apt-get update/sudo apt-get upgrade

然后执行以下操作:

sudo apt install python3-pip
sudo apt install libfbclient2
mkdir fdb-experiment
cd fdb-experiment
pip3 install fdb
nano connect.py
Run Code Online (Sandbox Code Playgroud)

connect.py

import fdb

# 172.26.69.161 is my Windows machine with Firebird
con = fdb.connect(dsn='172.26.69.161:d:/data/db/testdatabase.fdb', user='sysdba', password='masterkey')
cur = con.cursor()
cur.execute("select * from rdb$database")
print(cur.fetchall())
Run Code Online (Sandbox Code Playgroud)

然后:

python3 connect.py
Run Code Online (Sandbox Code Playgroud)

输出:

[(None, 225, None, 'ISO8859_1                      ')]
Run Code Online (Sandbox Code Playgroud)

由于 Windows 主机操作系统(运行我使用的 Firebird 服务器)存在一些网络问题,我确实必须在中间重新启动虚拟机。如果我执行,我只能重现你的问题sudo apt remove libfbclient2

换句话说,我无法重现你的问题。我唯一能想到的是,也许您正在使用旧版本的 fdb (我使用的是 1.8),它以不同的方式定位客户端库(但由于您的堆栈跟踪具有相同的行号,我会看到如果我删除libfbclient2,情况可能并非如此)。

您可能想尝试运行是否sudo ldconfig可以解决问题,这将重建共享库的缓存。如果这不起作用,那么检查是否有cat /etc/ld.so.conf.d/*列表/usr/lib/x86_64-linux-gnu(如果不起作用,那么我不完全确定解决该问题的正确行动方案是什么)。