modules from example another python linux fontforge

from - Configurando LD_LIBRARY_PATH desde dentro de Python



python import module from path (3)

¿Hay alguna forma de establecer especificar 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)


... 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 independientemente de 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 ...].


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).


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

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).