Skip to content
Advertisement

Add directory to PATH inside a Python script such that a third-party module can find a DLL with ctypes find_library

Let’s say a third-party module moduleXYZ.py (that I don’t want to fork/modify) does:

import ctypes
from ctypes.util import find_library
find_library("gsdll64.dll")

In my code main.py I’m importing it with

import moduleXYZ

This DLL is in C:Program Filesgsgs9.56.1bin which is not in my global system path.

Question: how to add this directory to the path (for the duration of the script run, not permanently for the system) from inside my script main.py such that find_library will succeed?

I tried:

import os
os.environ['PATH'] += ';C:Program Filesgsgs9.56.1bin'
sys.path += ['C:Program Filesgsgs9.56.1bin']
import mymoduleXYZ

but it still fails.

Note:

  • my script is always run with python main.py, and I don’t want to have to add this directory to path from a batch file or from terminal or from command-line: all this should be done inside the main.py script itself.

  • I’ve always read Permanently adding a file path to sys.path in Python, How to add to the PYTHONPATH in Windows, so it finds my modules/packages?, and similar questions but this doesn’t apply here

  • I don’t want to add this directory permanently to the system PATH

  • a general solution to add a directory to path for the currently ran script would be interesting, if possible not specific to ctypes/DLL but to everything using path in general


Edit: os.add_dll_directory looked promising but it doesn’t work here:

import os
from ctypes.util import find_library 
os.add_dll_directory(r'C:Program Filesgsgs9.56.1bin')
find_library(r'gsdll64.dll')  # None.........

find_library(r'C:Program Filesgsgs9.56.1bin')  # working

Advertisement

Answer

Oops, this was a noob mistake: I forgot to escape the string which contains b with r'...'. This works:

main.py

import os, sys
os.environ['PATH'] += r';C:Program Filesgsgs9.56.1bin'
import moduleXYZ

moduleXYZ.py

from ctypes.util import find_library 
print(find_library(r'gsdll64.dll'))

But a more general answer that would change the system path for the currently being-ran script, from the script itself would still be interesting.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement