使用ctypes(python)加载带括号路径的dll时出错

5 投票
2 回答
7440 浏览
提问于 2025-04-15 19:43

我想在一台64位的电脑上访问一个位于“c:/Program Files (x86)”文件夹里的dll文件。

当我用os.path.exists来检查这个dll是否存在时,结果是肯定的:

>>> print os.path.exists('c:/Program Files (x86)/Some Folder/SomeDll.dll')
True

但是当我尝试用ctypes加载这个dll时,却出现了以下错误:

>>> from ctypes import WinDLL
>>> some_dll = WinDLL('c:/Program Files (x86)/Some Folder/SomeDLL.dll')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python26\lib\ctypes\__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found

在32位的电脑上,这个dll文件位于“c:/Program Files”文件夹里,我可以毫无问题地打开它。我觉得问题可能出在文件夹名称中的括号上。因为返回的异常是WindowsError,看起来是操作系统加载库的功能出了问题。

所以,我的问题是:我该如何加载位于“c:/Program Files (x86)”文件夹里的dll文件?我不能把这个dll复制到其他地方,它必须保留在原来的路径下……

谢谢!

2 个回答

2

抱歉,我没有50个积分来评论(这个要求真是无聊),不过 /Program Files (x86)/ 其实就是 Progra~2,而 /Program Files/ 则是 Progra~1
这是为了防止Felipe Ferri再次看到这个 :) 或者其他想做同样事情的人。
注意:这假设你没有其他以 Progra 开头的长文件夹,如果有的话,结果可能会不同。你实际上是在从一个按字母顺序排列的文件夹列表中选择 - 这个方法适用于任何超过8个字符的文件夹,你只需要去掉最后两个字符,然后第一个加上~1,其他相同字符的文件夹依次递增。

8

你试过用 "C:/Progra~1/SomeFolder/SomeDll" 这个路径吗?

还有一个建议:

 os.chdir(r"C:\Program Files(x86)\SomeFolder")
 the_dll = WinDLL("SomeDLL.dll")      

撰写回答