Новый в Python: GLPK, не создающий правильно / Python ImportError

Это - вопрос о новичке и продолжение этого, где на меня указали GLPK.

Я пытаюсь получить PyGLPK, привязку Python для GNU, в который Линейное Программирование Одевает и выполнение, но независимо от того, что я делаю, я, может казаться, не создаю и не устанавливаю GLPK так, чтобы Python нашел его правильно. Это прибывает после выполнения./настраивать, сделайте, и sudo делают установку на библиотеках GLPK и следование инструкциям для PyGLPK.

А именно, вот ошибка, которую я получаю:

>>> import glpk  
Traceback (most recent call last):  
File "", line 1, in   
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

Я предполагаю, что что-то не связывается с где-то в другом месте, и что это, вероятно, имеет некоторое отношение к путям и переменным среды. Однако вот то, где мои способности в сбое оболочки, и я в замешательстве по тому, что сделать затем.

Редактирования

  1. Я могу выполнить Решатель GLPK (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)
    

Снова, существует, вероятно, простой ответ на это, но у меня не было удачи с Google с помощью терминологии, которую я знаю.

1
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

Проблема решена!

Первое предложение Томаса Воутера было наиболее точным: модуль glpk.so вообще не был связан с библиотекой C. Причина заключалась в том, что make построил исходные библиотеки GLPK, используя gcc4.2 и указав 64-битную архитектуру, в то время как модуль Python distutils настаивал на создании исходного кода PyGLPK. с использованием gcc-4.0 с 32-битной архитектурой.

Так как я не мог понять, как добавить флаги компилятора в distutils , я просто перестроил библиотеки GLPK, установив флаги компилятора distutils . Вот что наконец сработало.

Похоже, это проблема OS X 10.6. Сценарии ./ configure запрашивают архитектуру системы, которая по умолчанию, я думаю, равна x86_64 , хотя Python 2.6 лучше всего работает с 32-битными двоичными файлами.

1
ответ дан 3 September 2019 в 00:58
поделиться

На самом деле проблема не в Python. Модуль glpk - это модуль расширения, разделяемая библиотека C, которую загружает Python. Эта разделяемая библиотека C зависит от библиотеки GLPK C, которую она обертывает; загрузка модуля расширения должна загружать библиотеку GLPK C, чтобы модуль расширения мог ссылаться на символы из библиотеки GLPK C, например __ glp_lpx_print_ips . Видимо, что-то там не получается. Это может быть одна из нескольких вещей:

  1. glpk.поэтому модуль расширения вообще не может быть связан с библиотекой GLPK C. Это означало бы, что он был построен без аргумента -l , необходимого для линковки с библиотекой GLPK, что означает, что проблема заключается в процедуре сборки для модуля расширения glpk . Вы можете определить, зависит ли glpk.so от библиотеки C, используя инструмент ldd . Например:

    % 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 , что обычно делает ./ configure без аргумента - префикса .

1
ответ дан 3 September 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: