Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set LD_LIBRARY_PATH before importing in python

Python uses the PYTHONPATH environment-variable to determine in which folders it should look for modules. You can play around with it by modifying sys.path, which works nicely for pure Python-Modules. But when a module uses shared object files or static libraries, it looks for those in LD_LIBRARY_PATH (on linux), but this can't be changed as easily and is platform dependent as far as I know.

The quick-fix for this problem is of course to set the environment-variable or invoke the script like LD_LIBRARY_PATH=. ./script.py, but then you'll have to set it again for every new shell you open. Also, the .so files in my case will always be in the same directory as the .py file, but may very well be moved to another absolute path, so I'd like to set them automatically every time I invoke the script.

How can I edit the path in which the Python interpreter looks for libraries platform-independently on runtime?

EDIT:

I already tried os.environ['LD_LIBRARY_PATH'] = os.getcwd(), but to no avail.

like image 294
iFreilicht Avatar asked Apr 23 '14 12:04

iFreilicht


People also ask

What is LD_LIBRARY_PATH python?

Python, when gets the values of environment variables as in os. environ['LD_LIBRARY_PATH'] or os. environ['PATH'] , it copies the values, into a dictionary, from it's parent process's environment, generally bash (bash process's environment get's carried to the child process, the python running instance).

What is the difference between path and LD_LIBRARY_PATH?

PATH is for specifying directories of executable programs. LD_LIBRARY_PATH is used to specify directories of libraries.

What should be in LD_LIBRARY_PATH?

Set the LD_LIBRARY_PATH to include the directory or directories that contain your libraries.


2 Answers

UPDATE: see the EDIT below.

I would use:

import os  os.environ['LD_LIBRARY_PATH'] = os.getcwd()  # or whatever path you want 

This sets the LD_LIBRARY_PATH environment variable for the duration/lifetime of the execution of the current process only.

EDIT: it looks like this needs to be set before starting Python: Changing LD_LIBRARY_PATH at runtime for ctypes

So I'd suggest going with a wrapper .sh (or .py if you insist) script. Also, as @chepner pointed out, you might want to consider installing your .so files in a standard location (within the virtualenv).

See also Setting LD_LIBRARY_PATH from inside Python

like image 156
Erik Kaplun Avatar answered Sep 19 '22 04:09

Erik Kaplun


My solution to this problem is to put this as the first line of a Python script (instead of the usual shebang):

exec env LD_LIBRARY_PATH=/some/path/to/lib /path/to/specific/python -x "$0" "$@" 

And here is how this works:

  • with no shebang the current shell treats the file as a shell script,
  • "exec" ensures that this first line is also the last command from this file executed by the shell,
  • "env" is used here to set any environment variables, e.g. LD_LIBRARY_PATH,
  • an exact path to Python's interpreter can specified or "env" can find one in PATH,
  • "-x" is a Python's option which causes the first line to be ignored by the Python interpreter,
  • "$0" is the script name, "$@" is substituted by positional parameters.
like image 24
Jarek Avatar answered Sep 21 '22 04:09

Jarek