这是一个初学者问题,是 this one 的后续问题,我被指向 GLPK。
我正在尝试获取 PyGLPK , GNU Linear Programming Kit 的 Python 绑定(bind)启动并运行,但无论我做什么,我似乎都无法构建和安装 GLPK 以便 Python 正确找到它。这是在 GLPK 库上运行 ./configure、make 和 sudo make install 并按照 PyGLPK 的说明进行操作之后发生的。
具体来说,这是我得到的错误:
>>> import glpk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site- packages/glpk.so, 2): Symbol not found: __glp_lpx_print_ips
Referenced from: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so
Expected in: dynamic lookup
我认为某些东西没有链接到其他地方,并且它可能与路径和环境变量有关。然而,这就是我在 shell 中的能力失败的地方,我不知道下一步该做什么。
编辑
我能够从命令行运行 GLPK Solver (
glpsol
),所以我知道它是有效的,至少在理论上是这样。有一次我尝试使用 MacPorts 安装某个版本的 GLPK。我已经卸载了这个版本,尽管使用的是 MacPorts。
这是使用
otool -L
的结果,这显然是 OS X 对ldd
的回答:/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
同样,这个问题可能有一个简单的答案,但我在谷歌上使用我所知道的术语时没有遇到任何运气。
最佳答案
这个问题并不是 Python 特有的。 glpk
模块是一个扩展模块,是 Python 加载的 C 共享库。该 C 共享库依赖于它所包装的 GLPK C 库;加载扩展模块应加载 GLPK C 库,以便扩展模块可以引用 GLPK C 库中的符号,例如 __glp_lpx_print_ips 。显然,有些东西出了问题。这可能是以下几种情况之一:
glpk.so
扩展模块可能根本无法链接到 GLPK C 库。这意味着它是在没有链接 GLPK 库所需的-l
参数的情况下构建的,这意味着问题出在glpk
扩展模块的构建过程中。您可以使用ldd
工具判断glpk.so
是否依赖于C库。例如:% ldd /usr/lib/python2.6/lib-dynload/gdbm.so linux-gate.so.1 => (0xb77bb000) libgdbm.so.3 => /usr/lib/libgdbm.so.3 (0xb7799000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7780000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7639000) /lib/ld-linux.so.2 (0xb77bc000)
这表明我的
gdbm
扩展模块已链接到libgdbm
共享库(以及其他共享库)。glpk.so
扩展模块可能正确链接到 GLPK C 库,但动态链接器可能无法找到 C 库。通常这会产生不同的警告(关于无法找到 C 库),但这在 MacOS 上可能不会发生。您可以再次使用 ldd 工具看到这一点:它会列出依赖项,但不会列出加载的实际文件(它会显示“未找到”。)这通常是由于未安装 C 库或将其安装在动态链接器不知道要查找的位置所致。不幸的是,我不知道 MacOS X 如何进行库查找,以及如何修改它扫描的路径。 (在大多数 UNIX 系统上,您可以编辑
/etc/ld.so.conf
或/etc/ld.so.conf.d/
中的文件,或者运行ldconfig -m
。)glpk.so
扩展模块可能被正确链接,动态链接器可能正确找到该模块,但GLPK扩展模块可能根本没有定义这个符号。这可能是 GLPK 中的一个错误,或者可能是因为动态链接器正在寻找不同 GLPK C 库(不同版本,或者构建方式不同的版本),或者可能是因为 GLPK C 库的编译方式与glpk.so
扩展模块不同。不过,这有点难以诊断,因为这意味着深入研究实际的 C 库符号和编译期间使用的头文件。
我猜,考虑到所有因素,问题是#2。这是最常见的问题,尤其是在 /usr/local
中安装时,这就是不带 --prefix
参数的 ./configure
通常所做的事情.
关于python - Python 的新增内容 : GLPK not building properly/Python ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2728385/