python cdll 找不到模块

3 投票
2 回答
17649 浏览
提问于 2025-04-16 10:21

我有一个库,里面有两个dll文件和一个python包装器。

现在,我的代码是基于这三个文件和我的主python文件在同一个父目录下的。为了继续开发,我想把这些库的代码整理一下,移动到一个自己的lib/目录里。不幸的是,我尝试的办法都没有成功。

import ctypes

_lib = ctypes.cdll["./my.dll"]

上面的代码在python包装器文件中可以正常加载dll文件,前提是它在原来的位置。我尝试了多种方法来加载它到新位置,比如:

from ctypes import *
import os

path = os.path.dirname(os.path.realpath(__file__))
_lib = ctypes.CDLL(os.path.join(path, 'my.dll'))

但是python总是抛出一个异常,提示找不到模块……我已经复制并粘贴了路径,以确认这确实是.dll文件的有效绝对路径。

有没有人知道我需要做什么才能把这个库移动到一个子文件夹里?我当然可以把它留在原地,但我就是讨厌杂乱。

2 个回答

1

确切的错误信息会更有助于我们确认问题,但我觉得ctypes.dll(path)这个写法不太对。

比如,我在使用Python 2.7时遇到了这个问题:

>>> ctypes.dll("kernel32.dll")
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dll'

也许你应该这样写:

>>> _lib = ctypes.CDLL(os.path.join(path, 'my.dll'))
4

我也遇到过类似的问题,就是在加载 magic1.dll 文件时。这个文件需要另外两个 .dll 文件的支持,当我把 magic1.dll 从我当前的工作目录移走后,就无法加载了。

这个解决办法帮了我:

pathToWin32Environment = os.getcwd() + "/environment-win32/libmagic/"
pathToDll = pathToWin32Environment + "magic1.dll"
if not os.path.exists(pathToDll):
    #Give up if none of the above succeeded:
    raise Exception('Could not locate ' + pathToDll)
curr_dir_before = os.getcwd()
os.chdir(pathToWin32Environment)
libmagic = ctypes.CDLL('magic1.dll')
os.chdir(curr_dir_before)

撰写回答