使用python ctypes.CDLL()从其他目录加载.dll时出错


问题内容

我要以下目录结构:

MainProject  
    |    ...project files  
    |    rtlsdr\  
    |    |    rtlsdr.dll
    |    |    ...other .dll's etc.

我正在库 ctypes中 使用函数 CDLL() 进行加载。当我的工作目录是: __rtlsdr.dll``rtlsdr\

$ cd rtlsdr
$ python
> from ctypes import *
> d = CDLL('rtlsdr.dll')

但是,当我尝试从另一个目录加载文件时:

$ cd MainProject
$ python
> from ctypes import *
> d = CDLL('rtlsdr\\rtlsdr.dll')

我收到一个错误:

WindowsError: [Error 126] The specified module could not be found.

这里有什么问题?


问题答案:

一个DLL可能有其他DLL依赖不在工作目录或系统路径。因此,如果没有明确指定,系统将无法找到那些依赖项。我发现的最佳方法是将包含依赖项的目录的位置添加到系统路径:

import os
from ctypes import *
abs_path_to_rtlsdr = 'C:\\something\\...\\rtlsdr'
os.environ['PATH'] = abs_path_to_rtlsdr + os.pathsep + os.environ['PATH']
d = CDLL('rtlsdr.dll')

当前会话关闭后,PATH变量将返回其原始状态。

另一个选择是更改工作目录,但这可能会影响其他模块的导入:

import os
os.chdir(abs_path_to_rtlsdr)
# load dll etc...