Search code examples
pythonresourcesdynamic-dll-import

python cdll LoadLibrary and library resources relative paths


I'm trying to load the shared library which internally uses some resources. File structure is the following:

dir_a/script.py
dir_a/lib/lib.so
dir_a/model/model.bin

From script.py I'm using the following code to load tge library:

from ctypes import *
from os import path

script_dir = path.dirname(path.realpath(__file__))
lib_path = path.join(script_dir, "lib/lib.so")
lib = cdll.LoadLibrary(lib_path )

This allows me to run the script not only from script directory, but from the other directories as well and library location is resolved properly:

cd dir_a/lib
python ../script.py

But I'm facing with model.bin file access issue. Looks like library tries to load it using model/model.bin string literal and it is resolved only when I'm running the script from dir_a directory.

Is it possible to somehow specify working directory to loaded library to be the root directory to relative paths?


Solution

  • Most likely (I can't say for sure without looking at the code) lib.so expects the resource file to be present at model/model.bin. That's relative to current directory (CWD).

    One way of overcoming this is setting it (before loading the .so), via [Python.Docs]: os.chdir(path):

    os.chdir(script_dir)
    

    Might also want to check: