Is it possible to change environment variables of current process?
More specifically in a python script I want to change LD_LIBRARY_PATH
so that on import of a module 'x' which depends on some xyz.so
, xyz.so
is taken from my given path in LD_LIBRARY_PATH
is there any other way to dynamically change path from where library is loaded?
Edit: I think I need to mention that I have already tried thing like os.environ["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH', mypath)
but these modify the env. for spawned sub-process, not the current process, and module loading doesn't consider the new LD_LIBRARY_PATH
Edit2, so question is can we change environment or something so the library loader sees it and loads from there?
In my experience trying to change the way the loader works for a running Python is very tricky; probably OS/version dependent; may not work. One work-around that might help in some circumstances is to launch a sub-process that changes the environment parameter using a shell script and then launch a new Python using the shell.
Based on the answer from Employed Russian, this is what works for me
The reason
doesn't work is simple: this environment variable controls behavior of the dynamic loader (
ld-linux.so.2
on Linux,ld.so.1
on Solaris), but the loader only looks atLD_LIBRARY_PATH
once at process startup. Changing the value ofLD_LIBRARY_PATH
in the current process after that point has no effect (just as the answer to this question says).You do have some options:
A. If you know that you are going to need
xyz.so
from/some/path
, and control the execution of python script from the start, then simply setLD_LIBRARY_PATH
to your liking (after checking that it is not already so set), and re-execute yourself. This is whatJava
does.B. You can import
/some/path/xyz.so
via its absolute path before importingx.so
. When you then importx.so
, the loader will discover that it has already loadedxyz.so
, and will use the already loaded module instead of searching for it again.C. If you build
x.so
yourself, you can add-Wl,-rpath=/some/path
to its link line, and then importingx.so
will cause the loader to look for dependent modules in/some/path
.well, the environment variables are stored in the dictionary os.environ, so if you want to change , you can do