python - Python 的新增内容 : GLPK not building properly/Python ImportError

标签 python unix installation module importerror

这是一个初学者问题,是 this one 的后续问题,我被指向 GLPK。

我正在尝试获取 PyGLPKGNU 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 中的能力失败的地方,我不知道下一步该做什么。

编辑

  1. 我能够从命令行运行 GLPK Solver (glpsol),所以我知道它是有效的,至少在理论上是这样。

  2. 有一次我尝试使用 MacPorts 安装某个版本的 GLPK。我已经卸载了这个版本,尽管使用的是 MacPorts。

  3. 这是使用 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 。显然,有些东西出了问题。这可能是以下几种情况之一:

  1. 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 共享库(以及其他共享库)。

  2. glpk.so 扩展模块可能正确链接到 GLPK C 库,但动态链接器可能无法找到 C 库。通常这会产生不同的警告(关于无法找到 C 库),但这在 MacOS 上可能不会发生。您可以再次使用 ldd 工具看到这一点:它会列出依赖项,但不会列出加载的实际文件(它会显示“未找到”。)

    这通常是由于未安装 C 库或将其安装在动态链接器不知道要查找的位置所致。不幸的是,我不知道 MacOS X 如何进行库查找,以及如何修改它扫描的路径。 (在大多数 UNIX 系统上,您可以编辑 /etc/ld.so.conf/etc/ld.so.conf.d/ 中的文件,或者运行 ldconfig -m。)

  3. 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/

相关文章:

python - 计算 Pandas 中具有相同列值的行的平均值

java - 在不破坏东西的情况下将项目添加到 Ant 的路径

linux - 如何使用 BASH 脚本在文本文件上创建动态 header

selenium - 无法在 perl6 中安装 Selenium::WebDriver

python - 在 Python 中打开 URL 并获取最多 X 字节的最佳方法是什么?

python - 生成 2 的平方根的数字

linux - 检查返回值的 shell 方法的错误代码

scala - 首次运行时无法下载 SBT(Scala 的构建工具)的依赖项

c++ - 如何修复 `cmake .. && make install` "No rule to make target install"?

python - 将字符串放入列表理解中的列表中