Change current process environment's LD_LIBRARY_PATH
environment-variables, python, shared-libraries
Solution
The reason
os.environ["LD_LIBRARY_PATH"] = ...
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 at `LD_LIBRARY_PATH` once at process startup. Changing the value of `LD_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 set `LD_LIBRARY_PATH` to your liking (after checking that it is not already so set), and re-execute yourself. This is what `Java` does.
B. You can import `/some/path/xyz.so` via its absolute path before importing `x.so`. When you then import `x.so`, the loader will discover that it has already loaded `xyz.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 importing `x.so` will cause the loader to look for dependent modules in `/some/path`.
Problem
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?