Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python module dlls

Tags:

Is there a way to make a python module load a dll in my application directory rather than the version that came with the python installation, without making changes to the python installation (which would then require I made an installer, and be careful I didn't break other apps for people by overwrting python modules and changing dll versions globaly...)?

Specifically I would like python to use my version of the sqlite3.dll, rather than the version that came with python (which is older and doesn't appear to have the fts3 module).

like image 929
Fire Lancer Avatar asked Oct 18 '08 10:10

Fire Lancer


2 Answers

If you're talking about Python module DLLs, then simply modifying sys.path should be fine. However, if you're talking about DLLs linked against those DLLs; i.e. a libfoo.dll which a foo.pyd depends on, then you need to modify your PATH environment variable. I wrote about doing this for PyGTK a while ago, but in your case I think it should be as simple as:

import os os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH'] 

That will insert my-app-dir at the head of your Windows path, which I believe also controls the load-order for DLLs.

Keep in mind that you will need to do this before loading the DLL in question, i.e., before importing anything interesting.

sqlite3 may be a bit of a special case, though, since it is distributed with Python; it's obviously kind of tricky to test this quickly, so I haven't checked sqlite3.dll specifically.

like image 101
Glyph Avatar answered Sep 28 '22 17:09

Glyph


The answer with modifying os.environ['PATH'] is right but it didn't work for me because I use python 3.9. Still I was getting an error:

ImportError: DLL load failed while importing module X: The specified module could not be found.

Turned out since version python 3.8 they added a mechanism to do this more securely. Read documentation on os.add_dll_directory https://docs.python.org/3/library/os.html#os.add_dll_directory

Specifically see python 3.8 what's new:

DLL dependencies for extension modules and DLLs loaded with ctypes on Windows are now resolved more securely. Only the system paths, the directory containing the DLL or PYD file, and directories added with add_dll_directory() are searched for load-time dependencies. Specifically, PATH and the current working directory are no longer used, and modifications to these will no longer have any effect on normal DLL resolution. If your application relies on these mechanisms, you should check for add_dll_directory() and if it exists, use it to add your DLLs directory while loading your library.

So now this is the new way to make it work in python 3.8 and later:

import os os.add_dll_directory('my-app-dir') 

Again, the old way is still correct and you will have to use it in python 3.7 and older:

import os os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH'] 

After that my module with a dll dependency has been successfully loaded.

like image 21
Andrew Smeltzov Avatar answered Sep 28 '22 18:09

Andrew Smeltzov