Where does python look for a dll opened by ctypes.cdll.<name> on windows?
Question: I'm afriad I couldn't find a simple answer for this on the internet, so maybe
there will be one in the future because of this question!

I'm using pywiiuse, a python wrapper for the C wiiuse library on windows. I've
gotten several plain C examples working simply by including the dll, header,
and library in the directory of the source.

However, I'm wondering where to put the dll so that pywiiuse will find it. A
look at the source shows that it is loaded as follows:

    
    
    dll = ctypes.cdll.wiiuse
    

Running examples yields a module not found exception when I have the dll in
the same directory as my test example.

Where does python look for the dll?


Answer: The [Windows DLL search order](http://msdn.microsoft.com/en-
us/library/ms682586.aspx) is documented on MSDN. It's not Python-specific, and
there is no way to change the search order from a command-line option. (But
see the linked article for other ways to influence the search order.)

The source to
[`ctypes/__init__.py`](http://wpython11.wpython2.googlecode.com/hg/Lib/ctypes/__init__.py)
does:

    
    
    from _ctypes import LoadLibrary as _dlopen
    

I wasn't able to find the definition of `LoadLibrary` in
[`_ctypes.c`](http://wpython11.wpython2.googlecode.com/hg/Modules/_ctypes/_ctypes.c),
but presumably it is a wrapper for the Windows
[`LoadLibraryEx`](http://msdn.microsoft.com/en-us/library/ms684179.aspx)
function that behaves similarly to the POSIX
[`dlopen`](http://linux.die.net/man/3/dlopen) function, because that is how it
is used.

If you can modify the Python source to use the `ctypes.CDLL` constructor
instead, it should work:

    
    
    folder = os.path.dirname(os.path.abspath(__file__))
    dll_path = os.path.join(folder, "wiiuse.dll")    
    dll = ctypes.CDLL(dll_path)
    

If that isn't viable, you may be able to monkey-patch ctypes to handle this
specific case, but that seems a bit dangerous. Perhaps just copying the DLL to
be in the same folder with the Python DLL would be the easiest alternative.

