【问题标题】:How to get program to not throw "Error: Can't load Floyd's algorithm library"如何让程序不抛出“错误:无法加载弗洛伊德的算法库”
【发布时间】:2012-04-08 21:11:59
【问题描述】:

大家的另一个问题-

所以我试图让一个名为 Pysomap 的程序工作(它基本上是 ISOMAP,但对于 python [http://web.vscht.cz/spiwokv/pysomap/]),我尽可能地遵循指示,构建它在 Ubuntu、Windows 和 Fedora(预建库)上,但似乎无法让它工作。在windows(这是首选的实现平台)上,每次我去python并导入pysomap时,它都会给我上面的错误。有人知道怎么解决吗?

谢谢

-J

【问题讨论】:

  • 这里有太多开放式的方面。这是你能提供的最好的追溯信息吗?您在编译库时是否注意到任何构建错误?
  • 我认为我们需要一些追溯/错误/代码来更好地了解正在发生的事情。
  • 所以没有回溯错误...我正在查看 pysomap 代码,它这样做了:# Try to import floyd try: from floyd import * except: print "Error: Can't加载弗洛伊德的算法库” sys.exit(2) 表示找不到弗洛伊德?让我感到困惑的是,它在目录中......

标签: python windows linux isometric


【解决方案1】:

在pysomap目录下,创建一个setup.py文件,内容如下:

from distutils.core import setup, Extension

setup(name="pysomap",
      version="2007.07",
      url ="http://web.vscht.cz/spiwokv/pysomap/",
      description="A library for isometric feature mapping.",
      license='Unknown',
      author="Vojtech Spiwok",
      py_modules=["floyd", "pysomap"],
      ext_modules=[Extension('_floyd', ["floyd_wrap.c", "floyd.c"])]
      )

构建 _floyd 扩展(假设您安装了兼容 Python distutils 的 C 编译器):

python setup.py build_ext --inplace

运行 demo.py:

python demo.py

Calculating distance matrix ............    2.24 s
Using epsilon-isomap, epsilon = 0.500000, calculating 2-dimensional embedding
Calculating graph matrix ...............    1.21 s
Calculating the shortest path matrix ...    2.22 s
Multidimensionally scalling ............    7.11 s
--------------------------------------------------
Total procedure ........................   12.79 s

【讨论】:

  • 这真是个天才。我什至无法克服在 OSX 上手动构建的架构问题,但您的 distutils setup.py 与 ARCHFLAGS 结合起来确实有效。并不是我个人喜欢使用这个库,而是我自己试图为 OP 找出一个解决方案。
【解决方案2】:

我查看了代码,因为 Isomap 是一个很酷的算法。代码看起来不像是由熟悉 Python 的人编写的,整个 floyd 扩展模块编译有点粗制滥造——它实际上不是为我构建的,我很确定这是你的问题(他们抓住了为模块导入异常并打印出您给出的错误)。

我将build_floyd.sh 中的一些硬编码内容更改为我系统的不同硬编码值。 (一个适当的构建系统将使这变得不必要)。这是在我的 Ubuntu 系统中有效的方法。我测试过,运行正常。

#!/bin/sh
# run this script to generate library for Floyd's
# algorithm library

echo "generating input files using SWIG ..."
swig -python floyd.i

echo "compiling ..."
# change compiler if you use other than gcc
gcc -c floyd.c floyd_wrap.c -I/usr/include/python2.6 -fPIC

echo "linking ..."
ld -shared floyd.o floyd_wrap.o -o _floyd.so 

#echo "for SELinux you must run chcon ..."
#chcon -t textrel_shlib_t _floyd.so 

您可能还需要将demo.py 中的第一行更改为#!/usr/bin/env python

【讨论】:

    【解决方案3】:

    此源代码已有 5 年以上的历史,floyd 的构建脚本看起来采用硬编码的 python2.4。

    很明显,您的 floyd 模块没有构建。您很可能必须返回构建步骤并确保您正确生成了_floyd.so

    如果您正确构建了它,那么这对您来说应该不会失败:
    python -c "import _floyd"

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 2011-04-22
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多