mac - pythonpath environment variable
Cambiar el entorno de proceso actual LD_LIBRARY_PATH (4)
¿Es posible cambiar las variables de entorno del proceso actual?
Más específicamente en una secuencia de comandos de python, quiero cambiar LD_LIBRARY_PATH
para que al importar un módulo ''x'' que depende de algunos xyz.so
, xyz.so
se tome de mi ruta dada en LD_LIBRARY_PATH
¿Hay alguna otra manera de cambiar dinámicamente la ruta desde donde se carga la biblioteca?
Edit : creo que necesito mencionar que ya probé algo como os.environ ["LD_LIBRARY_PATH"] = mypath os.putenv (''LD_LIBRARY_PATH'', mypath)
Pero estos modifican la env. para el subproceso generado, no el proceso actual, y la carga del módulo no considera el nuevo LD_LIBRARY_PATH
Edit2 , entonces la pregunta es ¿podemos cambiar el entorno o algo para que el cargador de biblioteca lo vea y se cargue desde allí?
Basado en la respuesta del ruso empleado, esto es lo que funciona para mí
oracle_libs = os.environ[''ORACLE_HOME'']+"/lib/"
rerun = True
if not ''LD_LIBRARY_PATH'' in os.environ:
os.environ[''LD_LIBRARY_PATH''] = ":"+oracle_libs
elif not oracle_libs in os.environ.get(''LD_LIBRARY_PATH''):
os.environ[''LD_LIBRARY_PATH''] += ":"+oracle_libs
else:
rerun = False
if rerun:
os.execve(os.path.realpath(__file__), sys.argv, os.environ)
Bueno, las variables de entorno se almacenan en el diccionario os.environ, así que si quieres cambiar, puedes hacerlo.
os.environ["PATH"] = "/usr/bin"
En mi experiencia, tratar de cambiar la forma en que funciona el cargador para un Python en ejecución es muy complicado; probablemente OS / versión dependiente; puede que no funcione. Una solución alternativa que podría ayudar en algunas circunstancias es iniciar un subproceso que cambie el parámetro del entorno utilizando un script de shell y luego lanzar un nuevo Python utilizando la shell.
La razón
os.environ["LD_LIBRARY_PATH"] = ...
no funciona es simple: esta variable de entorno controla el comportamiento del cargador dinámico ( ld-linux.so.2
en Linux, ld.so.1
en Solaris), pero el cargador solo mira LD_LIBRARY_PATH
una vez en el inicio del proceso. Cambiar el valor de LD_LIBRARY_PATH
en el proceso actual después de ese punto no tiene efecto (tal como lo dice la respuesta a this pregunta).
Tienes algunas opciones:
R. Si sabe que va a necesitar xyz.so
de /some/path
, y controla la ejecución de la secuencia de comandos de Python desde el principio, simplemente configure LD_LIBRARY_PATH
a su gusto (después de verificar que aún no esté configurado), y volver a ejecutarse a ti mismo. Esto es lo que hace Java
.
B. Puede importar /some/path/xyz.so
través de su ruta absoluta antes de importar x.so
Cuando luego importa x.so
, el cargador descubrirá que ya ha cargado xyz.so
y usará el módulo ya cargado en lugar de buscarlo nuevamente.
C. Si x.so
ti mismo, puedes agregar -Wl,-rpath=/some/path
a su línea de enlace, y luego importar x.so
hará que el cargador busque módulos dependientes en /some/path
.