Configurando LD_LIBRARY_PATH desde dentro de Python

¿Hay alguna manera de establecer especificación durante el tiempo de ejecución donde Python busca bibliotecas compartidas?

Tengo fontforge.so ubicado en fontforge_bin y probé lo siguiente

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

y obten

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

Al hacer ldd en fontforge_bin/fontforge.so ofrece lo siguiente

 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) 

Su secuencia de comandos puede verificar la existencia / propiedad de la variable de entorno antes de importar su módulo, luego establecerlo en os.environ si falta, y luego llamar a os.execv () para reiniciar el intérprete de python usando los mismos argumentos de la línea de comando pero un conjunto actualizado de variables de entorno.

Esto solo es recomendable antes de cualquier otra importación (que no sea OS y sys), debido a los posibles efectos secundarios de la importación de módulos, como descriptores de archivos abiertos o sockets, que pueden ser difíciles de cerrar de forma limpia.

Este código establece LD_LIBRARY_PATH y 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 

Probablemente sea más limpio establecer esa variable de entorno como parte del entorno de inicio (en el proceso principal o en el archivo de trabajo systemd / etc).

… bueno, de alguna manera podría cargar todas las bibliotecas de alguna carpeta de su elección a través de ctypes y así ponerlas a su disposición sin importar el LD_LIBRARY_PATH.

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

o iterar a través de los archivos en ese directorio … obtienes la idea, una vez que se carga está ahí para ti [si las dependencias también están fuera de la ruta predeterminada, también deberías cargarlas …].

LD_LIBRARY_PATH establece la ruta del enlazador dynamic; que generalmente no se puede cambiar en tiempo de ejecución, ya que generalmente está en caché por el enlazador dynamic.

Sin embargo, ahí no es donde Python busca las importaciones , incluidas las importaciones de módulos. Cambiar sys.path es correcto.

 # 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' 

(Por cierto, es posible que desee ldd la biblioteca para ver si tiene alguna ruta de importación impar en la biblioteca. “ImportError: fontforge_bin / fontforge.so” parece extraño).