variable mac from example python shared-libraries environment-variables

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 .