Windows下Python使用ctypes加载EGL.dll失败的问题求助
加载EGL.dll时出现FileNotFoundError的排查方案
问题描述
在Windows环境下使用Python的ctypes库加载C:\Windows\System32\EGL.dll,确认文件已存在于指定路径,但运行代码时仍抛出错误:
FileNotFoundError: Could not find module 'C:\Windows\System32\EGL.dll' (or one of its dependencies). Try using the full path with constructor syntax.
核心代码片段如下:
from ctypes import CDLL from _ctypes import LoadLibrary # 自定义DLL加载函数 def load_dll(path: str) -> CDLL: if path == "" or path is None: raise TypeError("Please provide a valid path") handle = LoadLibrary(path) return CDLL(name=path, handle=handle) if handle != 0 else handle # 指定DLL路径并加载 dll_path = r"C:\Windows\System32\EGL.dll" load_dll(dll_path)
完整代码可参考用户提供的TokenHMR演示脚本。
已尝试操作
- 通过自定义函数调用
_ctypes.LoadLibrary,传入完整路径加载DLL后创建CDLL实例
预期与实际结果
- 预期:路径正确,EGL.dll应成功加载
- 实际:触发FileNotFoundError,提示模块或其依赖项未找到
错误原因
- Windows文件系统重定向:若使用32位Python,系统会自动将
C:\Windows\System32的访问请求重定向到C:\Windows\SysWOW64,若EGL.dll未放置在该目录或版本不匹配,会导致加载失败。 - 依赖库缺失:EGL.dll依赖其他动态链接库(如
libGLESv2.dll等),这些依赖文件未在系统路径或Python可访问目录中存在。 - 架构不兼容:下载的EGL.dll版本(32/64位)与Python或系统架构不匹配。
解决方法
1. 匹配Python与DLL的架构
- 验证Python架构:在命令行执行
python --version,查看输出是否标注(32-bit)或(64-bit)。 - 32位Python:将EGL.dll及其依赖库复制到
C:\Windows\SysWOW64;64位Python:确保EGL.dll为64位版本并放在C:\Windows\System32。
2. 补充缺失的依赖库
- 使用Dependency Walker工具打开EGL.dll,查看所有依赖项,将缺失的库文件复制到系统目录(
System32或SysWOW64)或Python脚本所在目录,注意依赖库的架构必须与EGL.dll一致。
3. 将DLL放在脚本目录
- 把EGL.dll和它的所有依赖库复制到Python脚本所在文件夹,修改代码中的路径为相对路径:
dll_path = r"EGL.dll"
这种方式可以绕过系统目录的重定向限制,同时确保依赖库能被正确加载。
4. 禁用文件系统重定向(仅32位Python)
如果必须使用32位Python并加载System32中的64位DLL,可通过ctypes临时禁用重定向:
import ctypes kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) # 禁用重定向 old_value = ctypes.c_void_p() kernel32.Wow64DisableWow64FsRedirection(ctypes.byref(old_value)) # 加载DLL load_dll(r"C:\Windows\System32\EGL.dll") # 恢复重定向 kernel32.Wow64RevertWow64FsRedirection(old_value)
注意:该操作可能影响其他系统调用,仅在必要时使用。
内容的提问来源于stack exchange,提问作者Aditya Kumar Singh
相关产品推荐
相关产品推荐

