Почему Python не может найти общие объекты, которые находятся в каталогах в sys.path?

Я пытаюсь импортировать pycurl:

$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory

Теперь, libcurl.so.4 находится в /usr/local/lib. Как Вы видите, это находится в sys.path:

$ python -c "import sys; print(sys.path)"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg', 
'/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', 
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk', 
'/usr/local/lib/python2.5/lib-dynload', 
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib', 
'/usr/local/lib/python2.5/site-packages']

Любая справка будет значительно цениться.

118
задан BR123 16 September 2019 в 10:37
поделиться

3 ответа

sys.path ищется только для модулей Python. Для динамически подключаемых библиотек искомые пути должны быть в LD_LIBRARY_PATH . Убедитесь, что ваш LD_LIBRARY_PATH включает / usr / local / lib , и если нет, добавьте его и попробуйте еще раз.

Дополнительная информация ( источник ]):

В Linux переменная среды LD_LIBRARY_PATH - разделенный двоеточием набор каталогов, где библиотеки следует искать сначала, прежде чем стандартный набор справочников; этот полезно при отладке новой библиотеки или используя нестандартную библиотеку для специального назначения. Среда переменная LD_PRELOAD общие списки библиотеки с функциями, которые отменяют стандартный набор, так же как /etc/ld.so.preload делает. Эти реализуется загрузчиком /lib/ld-linux.so. Я должен отметить, что, в то время как LD_LIBRARY_PATH работает на многих Unix-подобных систем, не работает на все; например, этот функционал доступен на HP-UX, но как переменная среды SHLIB_PATH и в AIX эта функция реализована переменная LIBPATH (с тем же синтаксис, список, разделенный двоеточиями).

Обновление: для установки LD_LIBRARY_PATH , используйте одно из следующих, в идеале в вашем ~ / .bashrc или эквивалентный файл:

export LD_LIBRARY_PATH=/usr/local/lib

или

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

Используйте первую форму, если она пуста (эквивалентна пустой строке или вообще отсутствует), и вторую форму, если это не так. Обратите внимание на использование экспорта .

151
ответ дан 24 November 2019 в 01:57
поделиться

Вы также можете установить LD_RUN_PATH в / usr / local / lib в своей пользовательской среде при первой компиляции pycurl. Это встроит / usr / local / lib в атрибут RPATH модуля расширения C. Таким образом, он автоматически знает, где найти библиотеку во время выполнения, без необходимости устанавливать LD_LIBRARY_PATH во время выполнения.

24
ответ дан 24 November 2019 в 01:57
поделиться

Убедитесь, что ваш модуль libcurl.so находится в пути к системной библиотеке, который отличается и отделен от пути библиотеки python.

«Быстрое исправление» - добавить этот путь в LD_LIBRARY_PATH переменная. Однако настройка этой системы (или даже учетной записи) является ПЛОХОЙ ИДЕЕЙ, поскольку ее можно настроить таким образом, чтобы некоторые программы находили библиотеку, которую не должны, или, что еще хуже, открывать дыры в безопасности.

Если ваши «локально установленные библиотеки» установлены, например, в / usr / local / lib, добавьте этот каталог в /etc/ld.so.conf (это текстовый файл) и запустите «ldconfig»

запустит утилиту кэширования, но также создаст все необходимые «символические ссылки», необходимые для работы системы загрузчика. Удивительно, что команда "make install" для libcurl этого еще не было, но возможно, что не может, если / usr / local / lib уже не находится в /etc/ld.so.conf.

PS: возможно, ваш /etc/ld.so. conf не содержит ничего, кроме "include ld.so.conf.d / *. conf". Вы все равно можете добавить путь к каталогу после него или просто создать новый файл внутри каталога, из которого он включается. Не забудьте после него запустить "ldconfig"

Будьте осторожны. Неправильный ответ может испортить вашу систему.

Дополнительно: убедитесь, что ваш модуль python скомпилирован с ЭТОЙ версией libcurl. Если вы просто скопировали некоторые файлы из другой системы, это не всегда сработает. В случае сомнений скомпилируйте свои модули в системе, в которой вы собираетесь их запускать.

Возможно, ваш /etc/ld.so.conf не содержит ничего, кроме "include ld.so.conf.d / *. conf". Вы все равно можете добавить путь к каталогу после него или просто создать новый файл внутри каталога, из которого он включается. Не забудьте после этого запустить "ldconfig"

Будьте осторожны. Неправильный ответ может испортить вашу систему.

Дополнительно: убедитесь, что ваш модуль python скомпилирован с ЭТОЙ версией libcurl. Если вы просто скопировали некоторые файлы из другой системы, это не всегда сработает. В случае сомнений скомпилируйте свои модули в системе, в которой вы собираетесь их запускать.

Возможно, ваш /etc/ld.so.conf не содержит ничего, кроме "include ld.so.conf.d / *. conf". Вы по-прежнему можете добавить путь к каталогу после него или просто создать новый файл внутри каталога, из которого он включается. Не забудьте после этого запустить "ldconfig"

Будьте осторожны. Неправильный ответ может испортить вашу систему.

Дополнительно: убедитесь, что ваш модуль python скомпилирован с ЭТОЙ версией libcurl. Если вы просто скопировали некоторые файлы из другой системы, это не всегда сработает. В случае сомнений скомпилируйте свои модули в системе, в которой вы собираетесь их запускать.

Неправильный ответ может испортить вашу систему.

Дополнительно: убедитесь, что ваш модуль python скомпилирован с ЭТОЙ версией libcurl. Если вы просто скопировали некоторые файлы из другой системы, это не всегда сработает. В случае сомнений скомпилируйте свои модули в системе, в которой вы собираетесь их запускать.

Неправильный ответ может испортить вашу систему.

Дополнительно: убедитесь, что ваш модуль python скомпилирован с ЭТОЙ версией libcurl. Если вы просто скопировали некоторые файлы из другой системы, это не всегда сработает. В случае сомнений скомпилируйте свои модули в системе, в которой вы собираетесь их запускать.

56
ответ дан 24 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

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