python loading c lib with CDLL, doesn't see libraries in the python path
Question: I'm trying to get some open source academic code working (the project home is
[here](http://lammps.sandia.gov/)). It is a big C++ codebase with a (very)
thin python wrapper which uses `CDLL` to load the C++ and call some C
functions that are available to allow primitive python scripting of the code.

However, the initial import code crashes because it can't find the .so files
sitting next to it in site-packages:

in the installed file:

    
    
    from ctypes import *
    
    try:
      self.lib = CDLL("_lammps.so")
    except:
      try:
        self.lib = CDLL("_lammps_serial.so")
      except:
        raise OSError,"Could not load LAMMPS dynamic library"
    

and in a script or the interpreter:

    
    
    from lammps import lammps
    l = lammps()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "lammps.py", line 42, in __init__
        raise OSError,"Could not load LAMMPS dynamic library"
    OSError: Could not load LAMMPS dynamic library
    

Other answers [might seem to have this
covered](http://stackoverflow.com/questions/2980479/python-ctypes-loading-dll-
from-from-a-relative-path), but this only works if `CDLL()` is called within
the script actually invoked (or the working directory of the prompt that ran
the interpreter) - i.e. if the 'relative path' is in user-space, rather than
python-library-space.

How do we reliably install for import a C/C++ library that we built ourselves?
Short of polluting the system library locations like `/usr/lib`, which isn't
very pythonic, I can't see an easy solution.

(EDIT: corrected function names, unclear refactoring unhelpful! sorry!)


Answer: Run under strace -eopen, you will see something like this:

    
    
    open("tls/x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("tls/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("_lammps.so", O_RDONLY|O_CLOEXEC)  = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 6
    open("/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    open("/usr/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    

Which shows you all the locations where python ctypes looks for your library.
So far I was unable to find a runtime environment variable tweak to make it to
add search locations on my system, perhaps you have to use absolute paths.

