为何WinDLL(library)失效而WinDLL(find_library(library))可行?
问题原因与解决方案
两者的核心差异在于DLL的查找逻辑完全不同:
1. WinDLL直接加载的逻辑
当你调用WinDLL(library)时,底层调用的是Windows系统的LoadLibraryW函数,它的查找路径顺序是:
- 进程当前的工作目录(注意:不是Python脚本所在的目录,而是你启动Python时的命令行当前目录,比如在IDE中可能是项目根目录而非脚本子目录)
- Windows系统目录(如
C:\Windows\System32) - Windows目录(如
C:\Windows) - PATH环境变量中列出的所有目录
它不会自动搜索Python脚本所在的目录,所以即使DLL和脚本同目录,只要工作目录不是脚本目录,就会找不到。
2. ctypes.util.find_library的查找逻辑
find_library在Windows平台的实现会额外遍历Python的sys.path列表(其中默认包含脚本所在目录),同时结合系统目录、PATH路径进行查找,还会主动给库名添加.dll后缀,因此能定位到同目录下的DLL文件。
解决方法
方法一:继续使用find_library(已验证有效)
from ctypes import WinDLL from ctypes.util import find_library _lib = WinDLL(find_library("vcmowr64"))
方法二:手动指定DLL绝对路径
直接拼接脚本所在目录和DLL文件名,确保加载路径准确:
from ctypes import WinDLL import os # 获取脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接DLL绝对路径 dll_path = os.path.join(script_dir, "vcmowr64.dll") _lib = WinDLL(dll_path)
方法三:将脚本目录加入PATH
让Windows系统的LoadLibraryW能搜索到脚本目录下的DLL:
from ctypes import WinDLL import os import sys script_dir = os.path.dirname(os.path.abspath(__file__)) # 将脚本目录加入系统PATH os.environ["PATH"] = f"{script_dir}{os.pathsep}{os.environ['PATH']}" _lib = WinDLL("vcmowr64")
内容的提问来源于stack exchange,提问作者user3047030
相关产品推荐
相关产品推荐

