Python ctypes:从相对路径加载DLL

时间:2010-06-05 13:16:01

标签: python ctypes

我有一个包含C DLL的Python模块wrapper.py。 DLL与模块位于同一文件夹中。因此,我使用以下代码加载它:

myDll = ctypes.CDLL("MyCDLL.dll")

如果我从自己的文件夹中执行wrapper.py,这是有效的。但是,如果我从其他地方运行它,它就会失败。那是因为ctypes计算相对于当前工作目录的路径。

我的问题是,有没有一种方法可以指定DLL相对于包装器而不是当前工作目录的路径?这将使我能够将两者结合在一起并允许用户从任何地方运行/导入包装器。

4 个答案:

答案 0 :(得分:24)

您可以使用os.path.dirname(__file__)获取Python源文件所在的目录。

答案 1 :(得分:12)

扩展马修的答案:

import os.path
dll_name = "MyCDLL.dll"
dllabspath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + dll_name
myDll = ctypes.CDLL(dllabspath)

这仅适用于脚本,不适用于控制台,也不适用于py2exe

答案 2 :(得分:8)

我总是将我的DLL所在的目录添加到路径中。这有效:

os.environ['PATH'] = os.path.dirname(__file__) + ';' + os.environ['PATH']
windll.LoadLibrary('mydll.dll')

请注意,如果使用py2exe,则不起作用(因为未设置__file__)。在这种情况下,您需要依赖sys.executable属性(http://www.py2exe.org/index.cgi/WhereAmI处的完整说明)

答案 3 :(得分:0)

另一个版本:

dll_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'MyCDLL.dll')
myDll = ctypes.CDLL(dll_file)