Установка LD_LIBRARY_PATH изнутри Python - PullRequest
19 голосов
/ 01 июля 2011

Есть ли способ установить значение во время выполнения , где Python ищет общие библиотеки?

У меня fontforge.so находится в fontforge_bin и пробовал следующее

os.environ['LD_LIBRARY_PATH']='fontforge_bin'
sys.path.append('fontforge_bin')
import fontforge

и получить

ImportError: fontforge_bin/fontforge.so: cannot open shared object file: No such file or directory

Выполнение ldd на fontforge_bin/fontforge.so дает следующее

linux-vdso.so.1 =>  (0x00007fff2050c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f10ffdef000)
libc.so.6 => /lib/libc.so.6 (0x00007f10ffa6c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f110022d000)

Ответы [ 3 ]

17 голосов
/ 23 августа 2014

Ваш сценарий может проверить наличие / правильность переменной среды перед импортом модуля, затем установить его в os.environ, если он отсутствует, и затем вызвать os.execv () для перезапускаинтерпретатор python, использующий те же аргументы командной строки, но обновленный набор переменных среды.

Это рекомендуется только до любого другого импорта (кроме os и sys) из-за потенциальногоимпортировать побочные эффекты, такие как дескрипторы открытых файлов или сокеты, которые могут быть затруднены при чистом закрытии.

Этот код устанавливает LD_LIBRARY_PATH и ORACLE_HOME:

#!/usr/bin/python
import os, sys
if 'LD_LIBRARY_PATH' not in os.environ:
    os.environ['LD_LIBRARY_PATH'] = '/usr/lib/oracle/XX.Y/client64/lib'
    os.environ['ORACLE_HOME'] = '/usr/lib/oracle/XX.Y/client64'
    try:
        os.execv(sys.argv[0], sys.argv)
    except Exception, exc:
        print 'Failed re-exec:', exc
        sys.exit(1)
#
# import yourmodule
print 'Success:', os.environ['LD_LIBRARY_PATH']
# your program goes here

Вероятно, лучше установить эту переменную среды как часть начальной среды (в родительском процессе или файле задания systemd / etc).

9 голосов
/ 10 февраля 2014

... ну вроде бы вы могли загрузить все библиотеки из какой-либо выбранной вами папки через ctypes и таким образом сделать их доступными для вас независимо от LD_LIBRARY_PATH.

from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/some_library.so')

или перебирайте файлы в этом каталоге ... вы понимаете, как только он загружен, он для вас [если зависимости также находятся вне пути по умолчанию, вы должны загрузить их тоже ...].

6 голосов
/ 01 июля 2011

LD_LIBRARY_PATH устанавливает путь динамического компоновщика; это обычно не может быть изменено во время выполнения, так как обычно оно кэшируется динамическим компоновщиком.

Однако Python не ищет import , включая импорт модулей. Изменение sys.path является правильным.

# ls foo/
_csv.so
# python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
>>> import sys
>>> sys.path.insert(0, "foo")
>>> import _csv
>>> _csv.__file__
'foo/_csv.so'

(Кстати, вы можете захотеть добавить в библиотеку ldd, чтобы увидеть, есть ли в ней какие-либо нечетные пути импорта.

...